c++ primer 13.1.4節練習(合成的拷貝構造函數與自定義拷貝函數區別)

13.1.4節練習

目的:Numbered類使每個對象都有唯一的標號

情況1:使用合成的拷貝構造函數

#include <iostream>
#include <memory>
#include <string>
#include <vector>
using namespace std;

class Numbered{
public:
	Numbered(){ mySeq = num++; }//構造函數
	int mySeq;
	//Numbered(const Numbered& i){ mySeq = num++; }
private:
	static int num;//靜態成員,在類內聲明,一般在類外定義。
	
};

//靜態成員類外定義
int Numbered::num = 0;//static關鍵字只在類內聲明時出現,不能在定義時重複static關鍵字

void f1(Numbered s)
{
	cout << s.mySeq << endl;
}

void f2(const Numbered& s)
{
	cout << s.mySeq << endl;
}
int main()
{
	Numbered a, b=a, c=b;
	f1(a);
	f1(b);
	f1(c);

	system("pause");
	return 0; 
}
結果如下:


分析:合成的拷貝構造函數是將各對象的成員簡單的拷貝,即比如Numbered b=a; 實際上執行的是

b.mySeq=a.mySeq;

故a,b,c的mySeq都是0;並且在函數f1傳遞實參時,也發生了拷貝構造函數。


情況2:使用自定義拷貝構造函數,非引用傳遞參數。

即加上

Numbered(const Numbered& i){ mySeq = num++; }
結果如下:


分析:使用自定義拷貝構造函數之後

Numbered a, b=a, c=b;
a b c的mySeq分別是0,1,2都是唯一的。

而在調用f1(),又發生了拷貝構造函數。造成形參的mySeq分別是3 4 5,結果打印3 4 5,而非 0 1 2;

此時不難看出num此時爲6.


情況3:使用自定義拷貝構造函數,引用傳遞參數。

即:

        f2(a);
	f2(b);
	f2(c);
此時調用f2函數時,不會發生拷貝。故打印結果0 1 2

結果:


這是正確的定義。



注意:使用靜態成員時

1.static關鍵字只用在類內聲明時用,在類外定義時不能重複static關鍵字。

2.靜態成員一般在類外定義,類內初始化時用字面值常量。

3.使用靜態成員時可以用類作用域符號如 int Numbered::num=0;或者用. Numbered a; a.num=0;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章