關于拷貝對象不調用初始化函數,如何給拷貝對象初始化?
class.h部分代碼:
Teacher(string name="Jim", int age = 15);
Teacher(const Teacher &T);
class.cpp部分代碼:
Teacher::Teacher(string name, int age) :m_strName(name),m_iAge(age){cout << "Teacher(string name, int age)" << endl;}
Teacher::Teacher(const Teacher &T) {cout << "Teacher(const Teacher &T)" << endl;}
main.cpp部分代碼:
Teacher t2;
cout << t2.getName() << " " << t2.getAge() << endl;
Teacher t3 = t2;
cout << t3.getName() << " " << t3.getAge() << endl;
運行結果如圖
我想到的解決方案是:
在main.cpp文件中加入設置代碼:setName(name);setAge(age);
缺點:對于const常量類型會引起編譯器無法編譯,無法初始化。
拷貝函數中加入初始化列表?
Teacher::Teacher(const Teacher &T) :m_strName(T.m_strName),m_iAge(T.m_iAge){cout << "Teacher(const Teacher &T)" << endl;}
????實驗結果是成功的
????????
由此思考一個問題:如果讓系統自動生成拷貝構造函數,它是否是默認將被拷貝對象的值傳到拷貝對象中?如果成立,則可以證明系統自動生成的拷貝構造函數中是帶初始化列表的。
????我將拷貝構造函數頭文件都刪除并運行,得出結果如下
????????
????由于沒有拷貝構造函數,所以輸出中少一句Teacher(const Teacher &T)。但是結果正確,所以這個論點是成立的。
問著問題問著解決了問題,有緣看到此的學友希望對你有幫助。再次感謝制作此系列教程的老師,簡直太強了!
2020-04-30
前面不是早就講過了。。。
2020-03-02
可以自己寫一個函數進行復制,比如this