关于const关键字的一些基本规定:
指针本身是常量不可变,不能使该指针指向新的对象,但是可以改变它指向的值;
char* const pContent;
指针所指向的内容是常量不可变,不能通过该指针来修改对象的值,但是可以使指针指向不同的对象;
const char *pContent;
两者都不可变
const char* const pContent;
不允许非const引用指向右值(临时变量)
例:
#include <iostream>
using namespace std;
class AA
{
public:
AA(int member = 0){
a = member;
}
AA(AA &local){ // 拷贝构造函数,没有const无法通过编译
a = local.a;
cout << "Copy constructor " << endl;
}
~AA()
{
cout<<"------"<<a<<endl;
}
int a ;
};
AA fun(AA &a)
{
a.a = 100;
return a;
}
AA& fun2(AA &a)
{
a.a = 99;
return a;
}
int main()
{
AA a;
cout<<"------1------"<<endl;
AA c = fun(a);
// AA c;
// c = fun(a);
cout<<"------2------"<<endl;
AA b = fun2(a);
cout<<"------3------"<<endl;
return 0;
}
编译无法通过,原因:
AA c = fun(a);
一句,fun(a)
将返回一AA
的对象,并且次数将生成一临时对象用于接受fun(a)
返回的对象;随后企图调用拷贝构造函数拷贝这一临时变量(而local
将作为临时变量的引用,这是不被允许的)。
AA c = fun2(a);
一句可以通过编译,因为fun2(a)
返回的是`AA &`,非临时对象。
将AA c = fun(a);
一句换为注释部分
AA c;
c = fun(a)
也可以通过,因为这里其实是赋值操作,并未调用拷贝构造函数。
添加const后,程序输出:
------1------
Copy constructor
------2------
Copy constructor
------3------
------99
------100
------99
从析构函数可以看出a
和b
为99,c
为100;析构函数执行顺序和构造函数相反。