C++拷贝赋值operator=

拷贝赋值:两个对象之间的拷贝

默认拷贝赋值导致错误

复制代码
#include <iostream>
class A {
public:
    A(int i=10){
        m_pi = new int(i);
        ii = i;
        
    }
    A(const A& that) {  
        std::cout << "深拷贝构造函数" << std::endl;
        m_pi = new int;  
        *m_pi = *that.m_pi;    
    }
    void print(void) {
        std::cout << ii << std::endl;
    }
    ~A(void) {
        
        std::cout << "xigouhansu:"<<this << std::endl;
        delete m_pi;
    }
private:
    int* m_pi;
    int ii;
    
};

int main()
{
    A a(100);
    A b;
    b.print();
    //b.operator=(a);
    b = a;//拷贝赋值;与b.operator=(a)等价
    //拷贝赋值:两个对象已经存在
    //编译器其实执行函数:b.operator=(a);
    //如果程序没写这个函数,会执行默认的,在执行析构函数时导致程序中断
    //中断原因:默认的拷贝赋值是直接拷贝各个成员变量值;由于m_pi是指针,a和b指向同一个堆区数据,不能delete两次
    //所以当存在指针类型的成员变量时,要自己写b.operator=(a)函数
    b.print();
    
    
}
复制代码

 

自写拷贝赋值函数

复制代码
#include <iostream>
class A {
public:
    A(int i=10){
        m_pi = new int(i);
        ii = i;
        
    }
    A(const A& that) {  
        std::cout << "senkaobei" << std::endl;
        m_pi = new int;  
        *m_pi = *that.m_pi;    
    }
    A& operator=(const A&that) {   //自写拷贝赋值函数
        if (&that != this) {  //防止自赋值
            *m_pi = *that.m_pi;  //拷贝指针的数据
            ii = that.ii;
        }
        return *this;    //返回自身引用
    }
    void print(void) {
        std::cout << ii << std::endl;
        std::cout << *m_pi << std::endl;
    }
    ~A(void) {
        
        std::cout << "xigouhansu:"<<this << std::endl;
        delete m_pi;
    }
private:
    int* m_pi;
    int ii;
    
};

int main()
{
    A a(100);
    A b;

    b.print();
    b = a;   //拷贝赋值
     std::cout << &a << std::endl;
    std::cout << &b << std::endl;
    b.print();
    
    
}
复制代码

 

 

 

 

 

 

 

 

posted @   天子骄龙  阅读(146)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
历史上的今天:
2020-07-06 pygame.sprite--精灵实例--红方块吃黑方块
2019-07-06 第一节 热机
2019-07-06 第三节 比热容
2019-07-06 第二节 内能
点击右上角即可分享
微信分享提示

目录导航