一个C++空类包含的东西

本文深入探讨C++中空类的概念及其隐含的成员函数,包括默认构造函数、拷贝构造函数、析构函数及重载赋值操作符。通过具体实例,解析如何正确实现拷贝构造函数以避免内存错误,特别是当类包含动态分配的指针成员时。
摘要由CSDN通过智能技术生成

一个空类含有的函数:

​

class Empty{
	
}; 
//  等价于
class Empty{
	public:
		Empty(){                           //默认构造函数
			
		}
		Empty(const Empty& rhs){           //拷贝构造函数
			
		}
		~Empty(){                          //析构函数
			 
		}
		Empty& operator=(const Empty rhs){ //重载赋值操作符函数
			
		}
        Empty* operator & ();                      // 取址运算符
    
        const Empty* operator & () const;       // 取址运算符const


};

​

这些函数只有在被调用的时候才会被编译器创建出来。

Empty e1;                   // 默认构造函数

Empty e2(e1);               // 拷贝构造函数
e2 = e1;                    //重载赋值操作符

拷贝构造函数和重载赋值操作符函数用于将来源对象的每一个非静态成员变量拷贝到目标对象。

如果类中含有指针型的数据成员、需要使用动态内存,程序员最好显式定义自己的复制构造函数,避免各种可能出现的内存错误。

默认的拷贝构造函数是浅拷贝,可能导致两个指针指向了堆里的同一个空间,在销毁对象时,两个对象的析构函数将对同一个内存空间释放两次,从而引发错误。

对于对象中动态成员,就不能简单赋值,而应该重新动态分配空间。

class Rect{
    public:
        Rect()      // 构造函数,p指向堆中分配的一空间
        {
            p = new int(100);
        }
        Rect(const Rect& r)
        {
            width = r.width;
            height = r.height;
            p = new int;    // 为新对象重新动态分配空间
            *p = *(r.p);
        }
        ~Rect()     // 析构函数,释放动态分配的空间
        {
            if(p != NULL)
            {
                delete p;
            }
        }
    private:
        int width;
        int height;
        int *p;     // 一指针成员
};

参考链接:
https://www.cnblogs.com/chusiyong/p/11295171.html

https://blog.csdn.net/lwbeyond/article/details/6202256

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值