为什么对于类的const成员,只能使用初始化列表,而不能在构造函数内部进行赋值操作

  1. 构造函数不能被声明为const函数,因此当我们创建一个类的const对象时,直到构造函数完成初始化的过程,对象才真正取得其“常量”的属性,因此,构造函数在const对象的构造过程中可以向其写值;见C++ primer P235;

  2. 初始化类的成员有两种方式,一是使用初始化列表,二是在构造函数体内进行赋值操作。因此,由于常量只能初始化不能赋值,所以常量成员必须使用初始化列表;[1]

    (当然你可以在类定义的时候,就对const成员变量进行赋值: class A{const int a = 1;};但是这样操作的话,这个变量就失去了意义,即基于这个类生成的所有对象a的值都为1!

    再更进一步的讲,其实非const变量也可以在类定义的时候就进行赋值的操作,但是static变量不可以!)

  3. 主要是性能问题,对于内置类型,如int, float等,使用初始化类表和在构造函数体内初始化差别不是很大,但是对于类类型来说,最好使用初始化列表,为什么呢?使用初始化列表少了一次调用默认构造函数的过程,这对于数据密集型的类来说,是非常高效的。[1]

    #include <iostream>
     
    using namespace std;
     
    class Test1
    {
    public:
        Test1() {cout << "Construct Test1" << endl ;} // 无参构造函数
        Test1(const Test1& t1) // 拷贝构造函数
        {
            cout << "Copy constructor for Test1" << endl ;this->a = t1.a ;
        }
        Test1& operator = (const Test1& t1) // 重载赋值运算符(也称为重载赋值函数)
        {
            cout << "assignment for Test1" << endl ;
            this->a = t1.a ;
            return *this;
        }
    private:
        int a ;
    };
     
    class Test2
    {
    public:
        Test1 test1; //此处第二次调用Test 1的construct;
        //std::cout<<"进入Test2 的构造函数"<<std::endl; //类中只能包含成员变量和成员函数!
        Test2(Test1 &t1){test1 = t1 ;} //此处的“=”调用重载的“=”操作符;
    };
     
    int main(){
        Test1 t1; //此处第一次调用Test1的construct;
        cout<<"end of fist construct t1"<<endl;
        Test2 t2(t1);
    }
    

    输出为:

    Construct Test1
    end of fist construct t1
    Construct Test1
    assignment for Test1
    

    解释一下:
    第一行输出对应调用代码中第一行,构造一个Test1对象
    第三行输出对应Test2构造函数中的代码,用默认的构造函数初始化对象test1 // 这就是所谓的初始化阶段
    第四行输出对应Test2的赋值运算符,对test1执行赋值操作 // 这就是所谓的计算阶段


    如果使用初始化列表来实现Test2的构造函数;

    class Test2
    {
    public:
        Test1 test1 ;
        Test2(Test1 &t1):test1(t1){}
    };
    

    输出为:

    Construct Test1
    end of fist construct t1
    Copy constructor for Test1
    

    第一行输出对应 调用代码的第一行
    第三行输出对应Test2的初始化列表,直接调用拷贝构造函数初始化test1,省去了调用默认构造函数的过程。
    所以一个好的原则是,能使用初始化列表的时候尽量使用初始化列表

原文链接:https://blog.csdn.net/baidu_35679960/article/details/78929018

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值