ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

176-C++重要知识点7

2022-01-28 11:03:27  阅读:172  来源: 互联网

标签:知识点 src int SeqList C++ 176 data seqa 构造函数


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,既可以用普通对象来拷贝构造,也可以用常对象来拷贝构造,而为了防止死递归,拷贝构造函数必须传引用

初始化列表只能在构造函数和拷贝构造函数中出现,在其他成员函数中不具有这种方式,原因是防止重复构建对象,如:SeqList seqa;SeqList seqb; seqb = seqa;当执行完前两句的时候seqa和seqb已经被构建出来了,如果赋值运算符重载函数有初始化列表,那么seqb就被重复构建了,对象只能构建一次,对象中的数据成员也只能构建一次

3.如果不希望用一个对象去初始化另一个对象,怎么办?将拷贝构造函数设计成私有的

如果我把main函数设计成类的友元函数后,还是可以用一个对象去初始化另一个对象,怎么办才能禁止呢?我在把拷贝构造函数设计成私有的以后,函数体我也不要了,只留下一个声明(SeqList(const SeqList& seq)

标签:知识点,src,int,SeqList,C++,176,data,seqa,构造函数
来源: https://blog.csdn.net/weixin_45964837/article/details/122712441

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有