美文网首页
C++参数为引用类型时const的使用

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

作者: 涌凉 | 来源:发表于2017-04-05 12:45 被阅读0次

    关于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;析构函数执行顺序和构造函数相反。

    相关文章

      网友评论

          本文标题:C++参数为引用类型时const的使用

          本文链接:https://www.haomeiwen.com/subject/tvutattx.html