CPP学习笔记-3

拷贝

用一个存在的object创建一个新的object
下面程序中两次调用拷贝构造

#include <iostream>
#include <string>
using namespace std;

static int objectCount = 0;
class HowMany{
    public:
        HowMany(){
            objectCount++;
            print("HowMany()");
        }
        HowMany(const HowMany &hw){
            objectCount++;
            print("HowMany(const HowMany&)");
        }
    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 = f(h);
    h.print("after call to f()");   
}

拷贝构造

拷贝构造格式: T::T(const T&); 若程序没有定义拷贝构造函数,编译器将会默认生成一个。类成员含有对象,将调用该对象的拷贝构造,否则,将是按照memberwise拷贝

当class中有pointer成员

默认拷贝时拷贝了指针,没有拷贝指针所指向的对象,析构的时候可能导致对同块内存的多次释放。需要自定义拷贝构造函数来创建内存。

什么时候拷贝构造会被调用?

a. 函数参数是对象本身,不是指针或引用

class Person{
    ...
};
void roster(Person player);

b. 用一个对象初始化另一个对象

Person baby_a("Fred");
Person baby_b = baby_a;
Person baby_c(baby_a);

c. 返回一个对象

Person f(){
    Person p;
    return p;
}

拷贝构造函数参考

a. 在通常情况下,自定义拷贝构造函数,不要依赖于系统默认的
b. 如果不想使用拷贝构造,将其声明为私有,防止默认拷贝构造被调用

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值