《C++ Primer》13.1.4节练习
練習13.14:
這是一個典型的應該定義拷貝控制成員的場合。如果不定義拷貝構造函數和拷貝賦值運算符,依賴合成的版本,則在拷貝構造和賦值時,會簡單復制數據成員。對本問題來說,就是將序號簡單復制給新對象。
因此,代碼中對a、b、c三個對象調用函數f,會輸出三個相同的序號——合成拷貝構造函數被調用時簡單復制序號,使得三個對象具有相同的序號。
練習13.15:
在此程序中,都是拷貝構造函數在起作用,因此定義能生成新的序號的拷貝構造函數會改變輸出結果。
但注意,新的輸出結果不是0、1、2,而是3、4、5。
因為在定義變量a時,默認構造函數起作用,將其序號設定為0。當定義b、c時,拷貝構造函數起作用,將它們的序號分別設定為1、2。
但是,在每次調用函數f時,由于參數是numbered類型,又會觸發拷貝構造函數,使得每一次都將形參s的序號設定為新值,從而導致三次的輸出結果是3、4、5。
練習13.16:
會改變輸出結果,新結果是0、1、2。
原因是,將參數改為const numbered &。由于形參類型由類類型變為引用類型,傳遞的不是類對象而是類對象的引用。這意味著調用f時不再觸發拷貝構造函數將實參拷貝給形參,而是傳遞實參的引用。因此,對每次調用,s都是指向實參的引用,序號自然就是實參的序號。而不是創建一個新的對象,獲得一個新序號。
練習13.17:
#include <iostream> using namespace std;class numbered {private:static int seq;public:numbered() {mysn = seq++;}numbered(numbered &n) {mysn = seq++;}int mysn; };int numbered::seq = 0;void f(numbered s) {cout << s.mysn << endl; }int main() {numbered a, b = a, c = b;f(a);f(b);f(c);return 0; }測試結果:
測試結果:
總結
以上是生活随笔為你收集整理的《C++ Primer》13.1.4节练习的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++分析使用拷贝控制成员和调用构造函数
- 下一篇: 弹窗广告关了弹窗广告关了怎么开