C++19——拷贝构造

void func(Currency p){
    cout<<"X="<<p.dollars();
}
Currency bucks(100,0);
func(bucks);
Currency p=bucks;//初始化
p=bucks;//赋值

在C++中可以用=和()初始化对象。

Person baby_a("Fred");
Person baby_b=baby_a;
Person baby_c(baby_a);
#include<iostream>
uaing namespace std;
static int objectCount=0;

class HowMany{
public:
    HowMany(){objectCount++;print("HowMany()");}
    HowMany(int i){objectCount++;print("HowMany(int)");}
    HowMany(const HowMany& o){objectCount++;print("HowMany(HM)");}//拷贝构造,传参数,在传的过程中不会进行拷贝构造
    HowMany(HowMany o){objectCount++;print("HowMany(HM)");}//错误,传的时候进行拷贝构造,递归了,没有结束的条件

    void print(const string& msg=""){
    if(msg.size()!=0) cout<<msg<<":";
    cout<<"objectCount"<<objectCount<<endl;
	}
    ~HowMany(){
        objectCount--;
        print("~HowMany()");
    }
};
HowMany f(HowMany x){
    cout<<"begin of f"<<endl;
    x.print("x argument inside f()");
    cout<<"end of f"<<endl;
    return x;
}
int main(){
    HowMany h;
    h.print("after construction of h");
    HowMany h2=h;
    //HowMany h2=f(h);
    h.print("after call to f()");
}
T::T(const T&);//拷贝构造,成员对成员的拷贝,而非字节对字节的拷贝
#include<iostream>
#include<cstring>
using namespace std;
class Person{
public:
    Person(const char*s);
    ~Person();
    void print();
    char* name;
    
}
Person::Person(const char*s){
    name=new char[::strlen(s)]+1;
    ::strcpy(name,s);
}
Person::~Person(){
    delete [] name;
}

int main(){
    Person p1("John");
    Person p2(p1);
    printf("p1.name=%p\n",p1.name);
    printf("p2.name=%p\n",p2.name);//p1 p2的name相同
    //存在错误,p1和p2指向同一段字符串的内存,p1和p2都要析构,意味着那段字符串被析构了两次,错误
}
#include<iostream>
#include<cstring>
using namespace std;
class Person{
public:
    Person(const char*s);
    Person(const Person& w);//Person的拷贝构造
    ~Person();
    void print();
    char* name;
    
}
Person::Person(const char*s){
    name=new char[::strlen(s)]+1;
    ::strcpy(name,s);
}
Person::Person(const Person& w){
    name=new char[::strlen(w.name)+1];
    ::strcpy(name,w.name);
}
Person::~Person(){
    delete [] name;
}

int main(){
    Person p1("John");
    Person p2(p1);//构造了一个新的Person对象
    printf("p1.name=%p\n",p1.name);
    printf("p2.name=%p\n",p2.name);//p1 p2的name相同
    //正确
}
Person captain(){
    Person player("George");
    return player;//返回对象,此处也会发生拷贝构造
}
Person f(){
    Person ip;//默认构造
    return ip;
}
int main(){
    Person p=f();//拷贝构造
    return 0;
}
#include<iostream>
#include<cstring>
using namespace std;
class Person{
public:
    Person(const string&);
    ~Person();
    void print();
    string name;
    
}
Person::Person(const string&){
    ......
}
Person::~Person(){
    delete [] name;
}

int main(){
    Person p1("John");
    Person p2(p1);
    printf("p1.name=%p\n",p1.name);
    printf("p2.name=%p\n",p2.name);//p1 p2的name相同
    //正确,string作为系统标准类库里的类一定存在拷贝构造,因此,不写拷贝构造也可以
}

C++建议使用string,而非char*。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值