标签:
通常,不用const来区别数据的类型,在声明过程中,const关键字起到的是修饰限定的作用。
1 符号常量(通常,在赋初值后,其值不能改变;而常量在定义时必须赋初值)
int i; const int k = 3; //标识符k代表的内存单元中存放的int型的数据,关键字const限定,不能通过该标识符k来修改所代表的内存单元中的int值
i和k代表的内存单元存放的都是int型数据,只是const限定的k为常量;符号常量,在声明时必须赋初值,赋初值后其值不能改变
下面尝试通过声明一个指针变量t引用k所代表的内存单元,希望通过指针t来改变常量k的值,但结果很奇怪,t指向的内存单元就是常量k的内存单元,但值却是2个不同的值
int main() { // const限定声明的量k为常量,通过k不能改变其所表示的值 const int k = 3; int *t; t = (int *) &k; *t = 7; cout<<&k<<endl; //0018FF14 cout<<t<<endl; //0018FF14 cout<<k<<endl; //3 cout<<*t<<endl; //7 return 0; };
2. 数组可以被声明为常量(指的是数组中的每个元素都被当作都被当作常量对待)
const char cc[] = "hello"; //在声明时必须赋初值,初始化后,数组元素的值不能改变
3 常成员函数、常数据成员
使用const修饰的成员函数 -- 常成员函数
使用const限定的成员函数,为常成员函数,在常成员函数中,不能修改目的对象的数据成员值(通常说的,不能改变对象的状态,mutable关键字修饰的数据成员,不算对象的状态)
在常成员函数中,不能调用非const成员函数(普通成员函数),因为普通成员函数存在的目的就是修改对象的状态
使用const修饰的数据成员 -- 常数据成员(对象实例中的常量部分 -- 每个对象中都拥有各自的副本,与static限定的静态数据成员相区分,静态数据成员 -- 在整个类中只有一个数据副本,为该类的所有对象共同使用、维护)
在数据成员的类型前加const关键字来表征,const限制了对该数据成员的修改,其意思是:该数据成员在构造函数初始化列表中赋初值后,在任何地方都不能对其值进行修改,以后只需做读取该常数据成员的的值即可 --- 此处正契合常量在类中的使用习惯
即类的数据成员也可以定义为常量
#include "stdafx.h" #include <string> #include <iostream> using namespace std; class ConstTest { private: int a; const int b; //常数据成员 mutable int c; public: ConstTest(int a, int b, int c) : b(b) //常数据成员的初始化,只能在构造函数的初始化列表中进行 { this->a = a; //this->b = b; //错误,error C2166: l-value specifies const object, 等号左边的值是常对象,而常对象在赋初值后其值不能改变 this->c = c; } void incre() { a++; } //在常成员函数中,不能修改目的对象的数据成员 void fun() const { c++; cout<<"a="<<a<<", b="<<b<<", c="<<c<<endl; } }; int _tmain(int argc, _TCHAR* argv[]) { ConstTest c_test(3, 5, 9); c_test.fun(); //a=3, b=5, c=10 c_test.incre(); c_test.fun(); //a=4, b=5, c=11 return 0; }
4 常引用
在引用声明时,使用const修饰,则被声明的引用就是常引用;通过声明的常引用不能对所引用的对象进行修改。
int a = 3; // const限定声明的引用k为常引用,通过引用k不能改变其所引用的对象的值 const int &k = a; //k = 9; //error C2166: l-value specifies const object const int b = 5; const int &t = b; //t = 9; //error C2166: l-value specifies const object
常引用,可以绑定到普通对象,也可以绑定到常对象,但常引用把绑定到的对象都当作常对象来使用。这意味着,对于引用基本数据类型的常引用,不能对其赋值,也不能修改其值;对于引用类类型的常引用,不能修改所引用对象的数据成员的值(也包括不能调用它的普通成员函数)
即,通过常引用,只能调用被绑定对象的常成员函数,不能调用它的普通成员函数,当然更不能修改被绑定对象的数据成员 -- 一个目的就是,常引用不能改变其引用对象的状态,因为常引用已经把其所引用的对象当作常对象来看待了。而常对象,是这样的对象:它的数据成员值在对象的整个生存期间内不能被改变,通过常对象不能调用普通成员函数,常对象对外可以的接口就是 --- 常成员函数。
普通引用,只能引用(绑定到)普通对象,要引用常对象需强制类型转换(调用默认的赋值构造函数完成,此处不确定)
标签:
原文地址:http://www.cnblogs.com/asnjudy/p/4508267.html