1.普通const变量初始化c++
int a = 9; const int ca = a; // 非const赋值给const int b = a; // const赋值给非const,若是是对象,则调用对象的operator=运算符,进行拷贝赋值 // b 是a的副本,b的修改不会影响到a,因此能够赋值
2.const引用变量函数
int a = 9; const int & ca = a; // 非const变量赋值给const引用 const int b = 9; const int &cb = b; // const变量赋值给const引用 int c = cb; // const引用赋值给非const变量 //int &cc = cb; // error,const引用不能赋值给非const引用,一旦能够赋值,则能够经过cc修改cb的值,这就破坏了cb是const引用的定义
3.const变量作函数参数this
void f(int &a) { cout << a << endl; } void fc(const int a) { cout << "fc a=" << a << endl; } int a = 9; const int & ca = a; // 非const变量赋值给const引用 fc(a); // 非const值传递给const变量,实际上调用对象的拷贝构造函数A(A a); fc(ca); // const引用传递给const变量,两者都不会修改ca的值 //f(ca); // 将const引用传递给非const引用参数,能够经过参数a修改ca的值,因此违背了ca的const属性,error
总结一:const常量与非const常量之间能够随意传输,可是const引用不行。只能非const引用传给const引用,不能const引用传递给非const引用。指针
一句话原则:凡是能修改const变量值的作法,都是非法的。code
4.const成员函数对象
类的成员函数,若是不须要修改类的成员变量,通常设置为const。接口
class A { public: A(int age) { this->age_ = age; }; int get()const { // const用于修饰this,表示当前对象this的属性值不会被修改 return this->age_; } void set(const int &age) { // const修饰入参,并非修饰this,因此this的属性能够被修改 this->age_ = age; // 调用对象的operator=方法,进行数据赋值。c++中,若是类没有定义operator=方法,编译器会默认合成一个。 } private: int age_; }; int main(int argc, int * argv[]) { int a = 9; const int & ca = a; // 非const变量赋值给const引用 A tom(10); cout << tom.get() << endl; tom.set(ca); cout << "main" << endl; system("pause"); }
总结:const在工程中,通常有一下几个用法资源
一、定义常量,用于替代宏定义。get
二、普通函数的参数中的常量引用。编译器
三、成员函数的this指针设置为const。
四、成员函数的入参的常量引用。
在c++中,有两点须要注意
// A a; // A b; // a = b; 这里实际调用A的operator=方法,进行数据拷贝,若是A没有显示定义该方法,则编译器会自动合成一个operator=方法
// A a; /* void f(A a); f(a); 这里的参数时值传递,会调用A的拷贝构造函数,进行数据拷贝。A(A a);若是A没有显示定义该构造函数,则编译器会自动合成一个 */
因而可知,c++中对象的拷贝,其实是由这两个函数默默完成的,即便没有编写这两个接口。从某种意义上来说,这种默认的作法,就是为了这种函数参数值传递与对象赋值。可是,若是对象的属性存在指针,则会有问题,这会引出浅拷贝与深拷贝的概念;有些对象若是不想被拷贝,好比对象太大,拷贝太耗费资源,则能够删除这两个方法,使用=delete。这个后面会介绍。