176-C++重要知识点7

本文探讨了C++中的切片问题,指出它仅在公有继承时发生,以及如何避免。文章还讨论了内存分布、拷贝构造函数和赋值运算符重载的实现细节,包括深拷贝与深赋值的重要性,以及如何防止不必要的对象复制。此外,提到了String类的输出操作以及移动构造和移动赋值的概念。
摘要由CSDN通过智能技术生成

1.C++中的切片问题

class Object
{
	int value;
public:
	Object(int x = 0):value(x) {}
};
class Base : public Object
{
	int num;
public:
	Base(int x = 0):Object(x + 10),num(x) {}
};
int main()
{
	Object obja;
	Base base(10);
	return 0;
}

切片问题是继承关系,必须是公有继承,只有把子对象赋给父对象时,才存在切片问题,obja对象成员只有一个value,是4字节,对于base对象来说,它继承了一个隐藏父对象,一共是8字节(value和num),value的值为20,num的值为10,可以把子对象赋给父对象,但是不能把父对象赋给子对象,赋值的时候,就把子对象的value值赋值给了父对象的value值

2.下面程序的内存分布是怎么样的?

#define SEQ_INIT_SIZE 10
class SeqList
{
	int data[SEQ_INIT_SIZE];
	int maxsize;
	int cursize;
public:
	SeqList() :maxsize(SEQ_INIT_SIZE),cursize(0) {}
	~SeqList() {}
};
int main()
{
	SeqList seqa;
	return 0;
}

进入到主函数的时候要给seqa分配空间,直接分配48个字节
在这里插入图片描述
写出上面程序的缺省拷贝构造函数和缺省赋值运算符重载函数

//拷贝构造函数
SeqList(const SeqList& src) :maxsize(src.maxsize), cursize(src.cursize)
{
    //memcpy(data,src.data,sizeof(data));//yes
    memcpy(data,src.data,sizeof(int) * cursize);//yes
}
//赋值运算符重载函数
SeqList operator=(const SeqList& src) 
{
	if(this != &src)
	{
		maxsize = src.maxsize;
   		cursize = src.cursize;
   		//memcpy(data,src.data,sizeof(data));//yes
    	memcpy(data,src.data,sizeof(int) * cursize);//yes
	}	  
    return *this;
}

为了使拷贝构造函数具有很好的通用性,加了一个const,既可以用普通对象来拷贝构造,也可以用常对象来拷贝构造,而为了防止死递归,拷贝构造函数必须传引用

初始化列表只能在构造函数和拷贝构造函数中出现,在其

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值