学习了博主的《漫谈继承技术》系列博文之后,相信大家都有所收获吧!这次博主将和大家一起探讨 《灵活而奇特的C++语言特性》 ,主要包括引用、常量(const)、常量表达式(constexpr)、静态(static)、外部(expert)、类型定义(typedef)、类型别名(aliases)、类型转换、作用域解析、统一初始化、显示转换运算符、特性(attribute)、用户自定义文本、头文件、可变长度参数列表和预处理器宏。尽管这个知识清单显得有点凌乱,但是这些话题都是博主经过精心挑选,是容易混淆的语言特性。本篇我们来学习一下const,增进大家对《灵活而奇特的C++语言特性》的理解。

const是constant的缩写,指保持不变的量。编译器会执行这一要求,任何尝试改变常量的行为都会当作错误处理。此外,当启用了优化时,编译器可以利用此信息生成更好的代码。关键字const主要有两种相关的用法。可以用这个关键字标记变量或者参数,也可以用const标记方法。本篇博文主要探讨const变量和参数的含义,希望对大家有一点帮助。

const变量和参数

在使用const之前,让我们先来了解一下const的特性:

①const常量,在定义时必须初始化。

②const常量,在编译的过程中将该常量替换为初始化时的值。

③可以通过强制类型转换将常量的地址赋给指针变量,通过指针变量来修改所指向的空间里的值。

咱们举个栗子吧:

#include <iostream>

using namespacestd;

int main(intargc,char**argv)

{

//定义const常量

constintnCValue = 10;

constdoublePI = 3.141592653;

//constint size;

//通过强制类型转换,使指针指向const常量

int*nPtr = (int*)&nCValue;

double*dPtr = (double*)&PI;

//通过指针修改const修饰的常量值

*nPtr =20;

*dPtr =4.5;

cout<< "*nPtr: "<< *nPtr << endl;

cout<< "nCValue: "<< nCValue << endl;

cout<< "*dPtr: "<< *dPtr << endl;

cout<< "PI: " << PI << endl;

return0;

}

程序运行结果:


注意,上面的特性要视具体的编译器而定,以上是我在VS 2013上的测试结果。我在图释中所说的整型包括bool、char、short、int和long型等数据类型。

如果将上面代码中的“constint size;”解注释,编译器将会报以下错误:

可能有的小伙伴会问:“C语言中的const和C++中的const有什么不同,为什么有的时候我将C++中编译通过的代码放到C源文件中就会出现编译错误?”。善于发现问题,说明你已经比别人强很多。其实,C语言中const定义的是只读变量,不是真正意义上的常量,C++中const定义的才是真正意义上的常量。那什么是真正意义上的常量呢?下面我们一起来揭秘一下吧。

#define _CRT_SECURE_NO_WARNINGS//关闭安全性检测

#include <iostream>

using namespacestd;

enum COLOR{RED = 20, BLUE,GREEN };

int main(intargc,char**argv)

{

constintsize = 20;

intnArray[size] = { 0 };//在C源文件中次行语句报错

inti = 0;

//初始化数组

for(auto&var : nArray)

{

var =++i;

}

//输出数组所有元素

cout<< "nArray = {";

foreach(autovar in nArray)

{

cout<< var << ", ";

}

cout<< "}" << endl;

//switch的参数必须要是整型常量

switch(size)//在C中次行语句报错

{

caseCOLOR::RED:

printf("size is equal COLOR::RED\n");

break;

caseCOLOR::BLUE:

printf("size is equal COLOR::RED\n");

break;

default:

printf("size is not in COLOR\n");

break;

}

return0;

}

程序运行结果:

在C语言中,const修饰的是只读变量,其实它本质还是变量,在真正需要使用常量的地方都会报语法错误。而C++中对const进行了扩充,使其修饰的是真正意义上的常量。

可以使用const来“保护”变量不被修改。这个关键字的一个重要用法是替换define来定义常量,这是const最直接的应用。上面程序中已经举过栗子啦,这里就不在赘述。可能有的小伙伴会问:“那const和define到底有什么区别呢?还是只是提供了一种新的定义常量的方式而已?”。当然不是啦,const比define更实用更安全,接下来就让我们一起来探讨const和define之间的区别吧。

const和define之间的主要区别:

①define定义的常量在预处理时进行替换,const定义的常量在编译的过程中进行替换

②define只是进行简单的字符替换,不进行类型检查,const则进行类型检查

③define定义的常量不会分配空间,而const则会分配空间

④define定义的常量不支持调试(不能查看它在内存空间里的值),而const定义的常量则可以。

⑤define不能定义形参,const则可以定义形参

关于这些区别的测试就留给大家啦,博主就不再编写相关代码了。

const修饰变量,这个变量包括指针变量。可能有的小伙伴听说过指针常量和常量指针的概念,并对此十分困惑,总是搞混。没关系,初学指针碰点壁也是很正常的。接下来我们就一起来聊聊它们之间的差异吧。

#include <iostream>

using namespacestd;

int main(intargc,char**argv)

{

intnValue1 = 10;

intnValue2 = 20;

//nPtr是常量指针

constint*nPtr = &nValue1;

//nCPtr是指针常量

int* const nCPtr = &nValue2;

//常量指针:不能通过指针修改所指向对象的值,但可以更改其指向,指向其他对象

//*nPtr= 30;

nPtr =&nValue2;

//指针常量:不能更改其指向,指向其他对象,但可以通过指针修改所指向对象的值

//nCPtr= &nValue1;

*nCPtr =50;

cout<< "nValue1: "<< nValue1 << endl;

cout<< "nValue2: "<< nValue2 << endl;

return0;

}

程序运行结果:

上述代码中“constint*nPtr = &nValue1;”也可以写成“intconst *nPtr = &nValue1;”,其效果是一样的。然而,这一规则却不适应与“int* const nCPtr = &nValue2;”,将该语句写为“int* nCPtr const = &nValue2;”或“intconst* nCPtr = &nValue2;”则不行,直接改变了语句,甚至无法通过编译。

可以尝试着从右向左读,“int* const nCPtr = &nValue2;”,const与nCPtr现结合,就知道nCPtr是一个指向int的const指针。另一方面,“int const*nPtr = &nValue1;”,“*”先和nPtr结合,就知道nPtr是一个指向const int的指针。

const可以应用于引用,它通过比应用于指针更简单。一是,引用默认为const,无法改变引用所指的对象。因此,无法显式地将引用标记为const。二是,无法创建一个引用的引用,所以引用通过只有一层间接取值。获取多层间接取值的唯一方法是创建指针的引用。举个栗子:

constint* const * const* const * constPtr = nullptr;

constint* const * const* const * const&ref = Ptr;

将对象作为参数传递时,默认选择是const引用。只有在明确需要修改对象时,才能忽略const。const修饰函数参数的的场景我们已经见过,例如拷贝构造函数,构造函数参数等。这里就不举栗子了,如果你确实想看栗子的话,就去《灵活而奇特的C++语言特性——引用(下)》,那里有一个封装MyString类的栗子。

关于const变量和参数的含义和使用我们就探讨到这里了,如果你还觉得意犹未尽,就请关注博主的《灵活而奇特的C++语言特性——const(二)》这篇博文,博主在那里讲述了const方法的含义和使用方法。

如果想了解更多关于C++语言特性相关的知识,请关注博主《灵活而奇特的C++语言特性》系列博文,相信你能够在那里寻找到更多有助你快速成长和加深你对C++语言特性相关的知识和一些特性的理解和掌握。当然,如果你想了解关于继承方面的技术,请关注博主《漫谈继承技术》系列博文。

灵活而奇特的C++语言特性——const(一)相关推荐

  1. 灵活而奇特的C++语言特性——统一初始化

    学习了博主的<漫谈继承技术>系列博文之后,相信大家都有所收获吧!这次博主将和大家一起探讨 <灵活而奇特的C++语言特性> ,主要包括引用.常量(const).常量表达式(con ...

  2. 灵活而奇特的C++语言特性——typedef aliases

    学习了博主的<漫谈继承技术>系列博文之后,相信大家都有所收获吧!这次博主将和大家一起探讨 <灵活而奇特的C++语言特性> ,主要包括引用.常量(const).常量表达式(con ...

  3. C++应用程序性能优化(三)——C++语言特性性能分析

    C++应用程序性能优化(三)--C++语言特性性能分析 一.C++语言特性性能分析简介 通常大多数开发人员认为,汇编语言和C语言比较适合编写对性能要求非常高的程序,C++语言主要适用于编写复杂度非常高 ...

  4. 语言特性与API设计

    我平时的主要工作之一,便是编写一些基础及通用的类库,能够在项目中大量复用.换句话说,我的工作目的,是让其他开发人员可以更好地完成工作.因此,如何设计更容易使用的API是我经常要考虑的东西,偶尔也会有一 ...

  5. 《C++应用程序性能优化::第二章C++语言特性的性能分析》学习和理解

    <C++应用程序性能优化::第二章C++语言特性的性能分析>学习和理解 说明:<C++应用程序性能优化> 作者:冯宏华等 2007年版.最近出了新版,看了目录,在前面增加了一章 ...

  6. c 11 主要的新语言特性,C 11系列

    什么是C++0x? C++0x是C++最新标准标准化过程中的曾用名,在这一系列文章中我们将介绍最新标准添加的一系列新的语言特性.在2011年9月份,C++0x正式由官方发布并命名C++11,现在很多编 ...

  7. Python语言特性和优缺点及什么是鸭子类型?

    1)Python语言特性? Python是静态还是动态类型?是强类型还是弱类型?         Python是动态强类型语言(不少人误以为是弱类型) 动态还是静态指的是编译期还是运行期确定类型 强类 ...

  8. # Python3 面试试题--Python语言特性

    Python语言特性 1 Python的函数参数传递 看两个例子: a = 1 def fun(a):a = 2 fun(a) print(a) # 1 a = [] def fun(a):a.app ...

  9. c++ 函数 -函数重载 -特殊用途的语言特性(默认实参,内联函数 ,constexpr ,assert,NDEBUG)

    c++ 函数 -函数重载 -特殊用途的语言特性 文章目录 c++ 函数 -函数重载 -特殊用途的语言特性 函数重载 定义: 重载和const形参 const_cast 和重载 const_cast 重 ...

最新文章

  1. Pytorch——YOLOv3
  2. git diff的用法
  3. 数据库的内连接和外连接区别?
  4. 翻译神器拓宽语言沟通边界传神TransnBox、T1惊艳中国企业互联网CEO 峰会
  5. Lake Counting POJ - 2386
  6. 如何使用Web.config的authentication节实现Form认证
  7. XXX集团财务决策支持系统——财务分析指标(系列五)
  8. Codeforces Round #675 (Div. 2) F. Boring Queries 区间lcm + 主席树
  9. matlab eval 不显示,matlab中 eval(command); 运算符无效的问题
  10. mysql mtop_mysqlmtop2.2运行出错
  11. python中用socket检测端口_python基于socket函数实现端口扫描
  12. ARP:地址解析协议
  13. C++提高部分_C++函数模板_基本用法---C++语言工作笔记081
  14. [论文阅读] Disentangled High Quality Salient Object Detection
  15. linux网络测速qerf,cywapp.net
  16. ccs中display:none visibility:hidden opacity:0的区别
  17. 【模拟信号】基于matlab调相信号产生+解调【含Matlab源码 987期】
  18. 保证速度与心情——pdg转pdf与djvu转pdf大法(不像网上的好多方法那样麻烦,方便快捷,纯傻瓜化操作!)
  19. python 文件合并
  20. 安徽宣城职业技术学院引入USB Server远程管理加密狗

热门文章

  1. 对话数睿数据穆鸿,起底400%增速背后的商业驱动力
  2. 哈希表(散列表)介绍
  3. 宇枫资本什么是第三方理财
  4. python实现计算四方和问题(四方定理的python实现)
  5. 如何将几个PDF合并且再重排页面顺序?
  6. 一文看懂数据服务DaaS
  7. 台式计算机操作系统的安装,自己要怎么给台式电脑安装windows操作系统
  8. Xshell免费使用办法,免注册码,免破解,Xsell过期了怎么办?不实就删帖
  9. 最高的奖励(贪婪算法)
  10. 从Outlook导出联系人到VCF文件