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)