effective c++條款05

編譯器可以暗自爲class創建default構造函數,copy構造函數,copy assignment函數

看個例子

#include <Windows.h>
#include <iostream>
#include <string>
using namespace std;

class E05
{
    friend ostream& operator<<(ostream& out, E05& e05)
    {
        out << e05.m_name << " " << e05.m_age;
        return out;
    }
public:
    E05() {}
    E05(string name, int age) :m_name(name), m_age(age){}
    ~E05(){}
private:
    string m_name;
    int m_age;
};

int main()
{
    E05 e05_f("小明", 20);
    cout << e05_f << endl;
    E05 e05_s(e05_f);//使用了默認複製構造函數
    cout << e05_s << endl;
    E05 e05_t;
    e05_t = e05_f;//使用默認賦值構造函數
    cout << e05_t << endl;
    system("pause");
    return 0;
}

小明 20
小明 20
小明 20
這就是默認複製和賦值構造函數的效果

但是假如E05類是這樣的

class E05
{
    friend ostream& operator<<(ostream& out, E05& e05)
    {
        out << e05.m_name << " " << e05.m_age;
        return out;
    }
public:
    E05() {}
    E05(string name, int age) :m_name(name), m_age(age){}
    ~E05(){}
private:
    string& m_name;
    const int m_age;
};
此時編譯器不會自動生成默認構造函數,reference對象無法更改指向的對象,const成員也無法更改,基於以上原因,默認賦值構造函數不會生成
此外,如果base class將賦值構造函數聲明爲private,編譯器將拒絕爲derived class生成一個賦值構造函數
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章