理解拷贝构造函数
例一:
1 #include<iostream> 2 using namespace std; 3 class numbered{ 4 private: 5 static int seq; 6 public: 7 numbered(){ mysn = seq++;} 8 int mysn; 9 }; 10 int numbered::seq = 0; 11 12 void f(numbered s){ 13 cout<<s.mysn<<“ ”; 14 } 15 int main(int argc,char**argv){ 16 numbered a,b=a,c=b; 17 f(a); f(b); f(c); 18 return 0 ; 19 }
输出 0 0 0
例二:
1 #include<iostream> 2 using namespace std; 3 class numbered{ 4 private: 5 static int seq; 6 public: 7 numbered(){ mysn = seq++;} 8 numbered(numbered &n) { mysn = seq++;} 9 int mysn; 10 }; 11 int numbered::seq = 0; 12 13 void f(numbered s){ 14 cout<<s.mysn<<endl; 15 } 16 int main(int argc,char**argv){ 17 numbered a,b=a,c=b; 18 f(a); f(b); f(c); 19 return 0 ; 20 }
输出 3 4 5
定义变量a时,默认构造函数起作用,序号设定为0,当定义b,c时,拷贝构造函数起作用,序号设定为1,2;
但调用函数f时,参数类型为numbered类型,又会触发拷贝构造函数,时每一次都将形参s的序号设定为新值,输出 3 4 5。
例三:
1 #include<iostream> 2 using namespace std; 3 class numbered{ 4 private: 5 static int seq; 6 public: 7 numbered(){ mysn = seq++;} 8 numbered(numbered &n) { mysn = seq++;} 9 int mysn; 10 }; 11 int numbered::seq = 0; 12 13 void f(const numbered &s){ 14 cout<<s.mysn<<endl; 15 } 16 int main(int argc,char**argv){ 17 numbered a,b=a,c=b; 18 f(a); f(b); f(c); 19 return 0 ; 20 }
输出 0 1 2
f的参数被改为const numbered &s,形参类型由类类型转变为引用类型,传递的不是类对象而是类对象的引用,这意味着调用f将不会触发拷贝构造函数将实参拷贝给形参,而是传递实参的引用。每次调用时,s都是指向实参的引用,序号自然是实参的序号,而不是创建一个新的对象。