c++ 复制构造函数


#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$ ./main
green apple
green apple
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'
 return 0;

}
输出:

pateo@pateo-B86N53X:~/work/study$ g++ main.cc -o main
pateo@pateo-B86N53X:~/work/study$ ./main
green apple
green apples
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){}  //构造函数

};

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 main
pateo@pateo-B86N53X:~/work/study$ ./main
green apple
green apples
------------------ 
green apple
green apple
pateo@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();
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值