c++ 复制构造函数

来源:互联网 发布:linux系统网络不通 编辑:程序博客网 时间:2024/05/16 01:01


#include <string>#include <iostream>using namespace std;class Fruit               //定义一个类,名字叫Fruit{ string name;     //定义一个name成员            string colour;   //定义一个colour成员public: void print()              //定义一个输出名字的成员print() {  cout<<colour<<" "<<name<<endl; } Fruit(const string &nst = "apple",const string &cst = "green"):name(nst),colour(cst){}  //构造函数};int main(){ Fruit apple;  //定义一个Fruit类对象apple Fruit apple2(apple);//调用的是我们自己定义的复制构造函数 apple.print(); apple2.print();          //你会发现输出多了个's' return 0;}

输出:

pateo@pateo-B86N53X:~/work/study$ ./maingreen applegreen applepateo@pateo-B86N53X:~/work/study$ 

对比下面


#include <string>#include <iostream>using namespace std;class Fruit               //定义一个类,名字叫Fruit{ string name;     //定义一个name成员            string colour;   //定义一个colour成员public: void print()              //定义一个输出名字的成员print() {  cout<<colour<<" "<<name<<endl; } Fruit(const string &nst = "apple",const string &cst = "green"):name(nst),colour(cst){}  //构造函数 Fruit(Fruit &aF):name(aF.name),colour(aF.colour)            //这是我们自己定义的复制构造函数 {  name +="s";                //让他和默认的不同 }};int main(){ Fruit apple;  //定义一个Fruit类对象apple Fruit apple2(apple);//调用的是我们自己定义的复制构造函数 apple.print(); apple2.print();          //你会发现输出多了个's' return 0;}
输出:

pateo@pateo-B86N53X:~/work/study$ g++ main.cc -o mainpateo@pateo-B86N53X:~/work/study$ ./maingreen applegreen applespateo@pateo-B86N53X:~/work/study$ 

对比下面

#include <string>#include <iostream>using namespace std;class Fruit               //定义一个类,名字叫Fruit{ string name;     //定义一个name成员            string colour;   //定义一个colour成员public: void print()              //定义一个输出名字的成员print() {  cout<<colour<<" "<<name<<endl; } Fruit(const string &nst = "apple",const string &cst = "green"):name(nst),colour(cst){}  //构造函数};private: Fruit(Fruit &aF):name(aF.name),colour(aF.colour)            //这是我们自己定义的复制构造函数 {  name +="s";                //让他和默认的不同 }int main(){ Fruit apple;  //定义一个Fruit类对象apple Fruit apple2(apple);//调用的是我们自己定义的复制构造函数 apple.print(); apple2.print();          //你会发现输出多了个's' return 0;}

输出:

pateo@pateo-B86N53X:~/work/study$ g++ main.cc -o main
main.cc:17: error: expected unqualified-id before ‘private’
pateo@pateo-B86N53X:~/work/study$ 


再对比下面的

#include <string>#include <iostream>using namespace std;class Fruit               //定义一个类,名字叫Fruit{ string name;     //定义一个name成员            string colour;   //定义一个colour成员public: void print()              //定义一个输出名字的成员print() {  cout<<colour<<" "<<name<<endl; } Fruit(const string &nst = "apple",const string &cst = "green"):name(nst),colour(cst){}  //构造函数 Fruit(Fruit &aF):name(aF.name),colour(aF.colour)            //这是我们自己定义的复制构造函数 {  name +="s";                //让他和默认的不同 }};int main(){ Fruit apple;  //定义一个Fruit类对象apple Fruit apple2 = apple;//调用的是我们自己定义的复制构造函数 apple.print(); apple2.print();          //你会发现输出多了个's'cout<<"------------------ "<<endl;Fruit apple3 ;apple3.print(); apple3 = apple;apple3.print();  return 0;}

输出:

pateo@pateo-B86N53X:~/work/study$ g++ main.cc -o mainpateo@pateo-B86N53X:~/work/study$ ./maingreen applegreen apples------------------ green applegreen applepateo@pateo-B86N53X:~/work/study$ 


深拷贝和浅拷贝可以简单理解为:如果一个类拥有资源,当这个类的对象发生复制过程的时候,资源重新分配,这个过程就是深拷贝,反之,没有重新分配资源,就是浅拷贝

以上都是浅复制,下面主要解释复制函数:

#include <iostream>using namespace std;class CA{ public:  CA(int b,char* cstr)  {   a=b;   str=new char[b];   strcpy(str,cstr);  }  CA(const CA& C)  {   a=C.a;   str=new char[a]; //深拷贝   if(str!=0)    strcpy(str,C.str);  }  void Show()  {   cout<<str<<endl;  }  ~CA()  {   delete str;  } private:  int a;  char *str;};int main(){ CA A(10,"Hello!"); CA B=A; B.Show(); return 0;} 


其中下面为析构函数:

~CA()  {   delete str;  }




复制构造函数在构造数组对象的使用


Sales_item primer_eds[] = {      string("0-201-16487-6");      string("0-201-16487-8");      string("0-201-16487-1");      Sales_item();};


原创粉丝点击