理解拷贝构造函数

例一:

 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 }
View Code

输出 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 }
View Code

输出 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 }
View Code

输出 0 1 2

f的参数被改为const numbered &s,形参类型由类类型转变为引用类型,传递的不是类对象而是类对象的引用,这意味着调用f将不会触发拷贝构造函数将实参拷贝给形参,而是传递实参的引用。每次调用时,s都是指向实参的引用,序号自然是实参的序号,而不是创建一个新的对象。

posted @ 2020-07-10 16:17  wsl96  阅读(182)  评论(0编辑  收藏  举报