C++ 中const的总结
2015-10-11 16:00
316 查看
const声明一个只读变量
与其他变量不同,除非特别说明,在全局作用域声明的const变量是定义该对象的文件的局部变量,非const变量默认为extern。要是const变量能够在其他的文件中访问,必须显示地指定它为extern。
const引用能指向const变量或非const变量,非const引用只能指向非const对象
const引用可以初始化为不同类型的对象或者初始化为右值同样的初始化对于非const引用却是不合法的,而且导致编译错误
在const成员函数中,this指针是一个const类型的const指针,非const成员函数的中this位指向类类型的const指针。因此下面的例子不合法
const 对象只能只能使用const 成员(数据成员和函数成员)。非const对象可以使用任意成员。
如果要在const修改数据成员,则数据成员必须用mutable 声明
构造函数或析构函数不可以使用类型限定符,也就不可以声明为const。
成员函数如果声明为const,则在定义时也需要加上const
对于const的数据成员必须在初始化列表初始化。唯一例外的是static const int变量可以在类中定义初始化(注意这里限定为整形,这里包括char、int、 long、枚举,不包括double,至于为什么目前不清楚)这里不同编译器处理并不同,VS2010上double型的报错,而在codeblock 编译却是合法的
与其他变量不同,除非特别说明,在全局作用域声明的const变量是定义该对象的文件的局部变量,非const变量默认为extern。要是const变量能够在其他的文件中访问,必须显示地指定它为extern。
const引用能指向const变量或非const变量,非const引用只能指向非const对象
const引用可以初始化为不同类型的对象或者初始化为右值同样的初始化对于非const引用却是不合法的,而且导致编译错误
int i = 42; double dval = 3.14; const int &ref1 = 42; //右值 const int &ref2 = dval ; (这里编译器会转换为 int temp = dval; const int &ref2 = temp)如果这里ref2不是const,那么可以给ref2赋值,但实际上修改的是temp,所以不允许将非const引用初始化为不同类型的对象
在const成员函数中,this指针是一个const类型的const指针,非const成员函数的中this位指向类类型的const指针。因此下面的例子不合法
class A { public: A():x(32){} A &display_x() const //Error:无法将const A& 转换为 A& { cout << x; return *this; } void set_x(int val) { x = val; } private: int x; }; 如果在前面加上const 的话就不能这样使用 A a = A(); a.diaplay_x().set_x(); 一个解决方法是覆盖display_x()函数,则正确的定义如下 class A { public: A():x(32){} const A &display_x() const { cout << x; return *this; } A &display_x() { cout << x; return *this; } void set_x(int val) { x = val; } private: int x; };
const 对象只能只能使用const 成员(数据成员和函数成员)。非const对象可以使用任意成员。
如果要在const修改数据成员,则数据成员必须用mutable 声明
构造函数或析构函数不可以使用类型限定符,也就不可以声明为const。
成员函数如果声明为const,则在定义时也需要加上const
对于const的数据成员必须在初始化列表初始化。唯一例外的是static const int变量可以在类中定义初始化(注意这里限定为整形,这里包括char、int、 long、枚举,不包括double,至于为什么目前不清楚)这里不同编译器处理并不同,VS2010上double型的报错,而在codeblock 编译却是合法的
相关文章推荐
- Python动态类型的学习---引用的理解
- 土人系列AS入门教程 -- 对象篇
- C#托管堆对象实例包含内容分析
- C#实现获取不同对象中名称相同属性的方法
- Lua和C语言的交互详解
- javascript asp教程第十一课--Application 对象
- PowerShell中使用Out-String命令把对象转换成字符串输出的例子
- VBS教程:对象-正则表达式(RegExp)对象
- C#检查指定对象是否存在于ArrayList集合中的方法
- sql2008启动代理未将对象应用到实例解决方案
- 关于C语言中参数的传值问题
- 简要对比C语言中三个用于退出进程的函数
- 深入C++中API的问题详解
- 基于C语言string函数的详解
- C#编程自学之类和对象
- C语言中fchdir()函数和rewinddir()函数的使用详解
- C语言内存对齐实例详解
- 使用C语言判断英文字符大小写的方法
- c语言实现的带通配符匹配算法
- C语言实现顺序表基本操作汇总