C++参数为引用类型时const的使用

关于const关键字的一些基本规定:

  1. 指针本身是常量不可变,不能使该指针指向新的对象,但是可以改变它指向的值;
    char* const pContent;

  2. 指针所指向的内容是常量不可变,不能通过该指针来修改对象的值,但是可以使指针指向不同的对象;
    const char *pContent;

  3. 两者都不可变
    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

从析构函数可以看出ab为99,c为100;析构函数执行顺序和构造函数相反。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容