构造函数初始化列表 与 赋值 的区别

区别 1: 可能只知道 一个效率高一个效率低,具体低在哪里?
区别 2:成语变量是 引用, 或者const 修饰,必须初始化.

  • 区别2 这里不做解释, 具体讲解1:

如果成员变量类型是 内置类型(int, char ), 那么初始化和赋值的成本是相同的.这里的效率高低, 指的是自定的类型(class)

class test
{
public:
    test(){
        std::cout<<"construct..."<<std::endl;
    }
    test(test &t)
    {
        std::cout<<"copy construct ..."<<std::endl;
    }
    test& operator =(test &t)
    {
        std::cout<<"copy assignment..."<<std::endl;
        return *this;
    }
};
class yang
{
public:
    yang(test y);
    yang(test &y);
    test ff;
};
/*赋值  & 参数传递方式:赋值*/
yang::yang(test t)
{
    ff = t;
}
/*初始化 & 参数传递方式:赋值*/
yang::yang(test t):ff(t)
{
}
/*赋值 & 参数传递方式:引用*/
yang::yang(test &t)
{
	 ff = t;
}
/*初始化列表 &  参数传递方式:引用*/
yang::yang(test &t):ff(t)
{
}

输出结果

初始化列表 & 参数传递方式:引用
 test t;
 std::cout<<"----------------"<<std::endl;
 yang sen(t);

 construct...
 ----------------
 copy construct ...  输出结果: 只调用了拷贝构造函数
赋值 & 参数传递方式:引用
test t;
std::cout<<"----------------"<<std::endl;
yang sen(t);

construct...
----------------
construct...
copy assignment...  输出结果: 调用了构造函数, 以及拷贝赋值函数

参数传递如果不是引用的话, 更离谱

初始化 & 参数传递方式:赋值
construct...
test t;
std::cout<<"----------------"<<std::endl;
yang sen(t);

construct...
----------------
copy construct ...
copy construct ...   两次拷贝构造

赋值 & 参数传递方式:赋值
test t;
std::cout<<"----------------"<<std::endl;
yang sen(t);

construct...
----------------
1: copy construct ...
2: construct...
3: copy assignment...

解释下: 
1: copy construct ...   是调用 yang sen(t) 进行参数传递,
2: construct...			是定义 test ff;
3: copy assignment...	是对ff赋值  ff = t;

如有哪里不对的地方, 请指出,后期会更改

发布了36 篇原创文章 · 获赞 19 · 访问量 5万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章