C++ 拷贝构造函数 和 六大函数

本文深入探讨了C++中拷贝构造函数与移动构造函数的调用时机,包括函数参数传递、函数返回值及对象初始化等场景。同时,对比了拷贝与移动构造在性能上的差异,通过实例代码展示了如何利用移动语义优化资源管理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.  C++什么时候会调用 拷贝构造函数?

     a.一个对象作为函数参数,以值传递的方式传入函数体;

     b.一个对象作为函数返回值,以值传递的方式从函数返回;(实际使用时,会被编译器优化掉)

     c.一个对象用于给另外一个对象进行初始化(常称为赋值初始化)

        如:

Animal a;
Animal b(a);

// 或者
Animal a;
Animal b = a;

2. C++ 6大函数

   1.构造函数

   2.move构造函数

   3.move赋值操作符

   4.复制构造函数

   5.赋值操作符

   6.析构函数

关于move构造函数 和 move赋值操作符,可以提高性能:

// 测试 move
class Animal{
    
public:
    
    Animal(){}
    Animal(const char* name,int age){
        _age = age;
        _name = new char[strlen(name)];
        strcpy(_name,name);
    };
    
    // 拷贝构造函数
    Animal(const Animal& other){
        if (_name) {
            printf("[Animal  拷贝构造函数]看看会不会调用\n");
            delete [] _name;
            _name = nullptr;
        }
        
        cout << "[Animal Copy Constructor]  called" << endl;
        _name = new char[strlen(other._name)];
        strcpy(_name,other._name);
        _age = other._age;
    }
    
    // 赋值
    Animal& operator=(const Animal& other){
        
        if (this == &other) {
            return *this;
        }
        
        if (_name) {
            printf("[Animal   赋值]看看会不会调用\n");
            delete [] _name;
            _name = nullptr;
        }
        cout << "[Animal Assign Constructor]  called" << endl;
        _name = new char[strlen(other._name)];
        strcpy(_name,other._name);
        _age = other._age;
        return *this;
    }
    
    // move copy constructor
    Animal(Animal&& other){
        cout << "move copy constructor called." << endl;
        _name = other._name;
        _age = other._age;
        other._name = nullptr;
    }
    
    // move assign constructor
    Animal& operator=(Animal&& other){
        if (this == &other) {
            return *this;
        }
        
        if (_name) {
            delete [] _name;
            _name = nullptr;
        }
        
        cout << "move assign constructor called." << endl;
        _name = other._name;
        _age = other._age;
        other._name = nullptr;
        return *this;
    }
    
    void show(){
        cout << "name:" << _name << ";  age :" << _age << endl;
    }

    ~Animal(){
        cout << "Animal Deconstructor" << endl;
        if (_name) {
            delete [] _name;
        }
    }
   
private:
    
    int _age = 0;
    char* _name = nullptr;
};

Animal genAnimal(){
    return Animal("wangwu",3);
}

测试:

int main(){

    // 会调用 move copy constructor
    vector<Animal> V;
    V.push_back(Animal("zhangsan",1));

    // 会调用  move assign constructor
//    Animal a("zhangsan",1);
//    a = genAnimal();
    
    return 0;
}

主要需要明白什么时候调用   copy  constructor,什么时候调用 assign operator.

转载于:https://www.cnblogs.com/daihanlong/p/4704915.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值