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;