C++拷贝赋值函数

xiaoxiao2022-06-11  40

运用Copy函数和Copy assignment函数进行赋值操作应该注意的两点: 1) 复制所有local成员变量 2) 调用所有基类内的适当的copying函数。 这里面有一个很可怕的规则:当你不用编译器默认的拷贝函数或者赋值函数时,编译器也不会对你自己写的这两个函数进行报警。所以必须要很谨慎和小心。 对于没有继承的类来说,写这两个函数一般注意指针类型的复制就可以了 Class Base{ Public: Base(Base& base); Base& operator=(const Base& base); Private: char* name; int age; }; Base& Base::operator=(const Base& base) { if(strcmp(name,base .name) = = 0) return *this; //自我复制的检测 name = new char[strlen(base.name)+1]; strcpy(name,base.name); return *this; } 如果后来增加了一个int age,但operator=里面什么都没有做,编译器不会出错!! 还有一种是对于继承类: Class SubBase : public Base { public: SubBase(SubBase& subbase); SubBase& operator=(const SubBase& subbase); pirvate: int subage; }; 如果 SubBase::SubBase(SubBase &subbase) :subage(subbase . subage) //这样做就够了吗? { } SubBase& SubBase::operator=(const SubBase& subbase) { subage = subbase . subbase; //这样做就够了吗? return *this; } 如果仅仅这样,就说明了当进行Coyp构造函数时,实际上真正赋值的对象只有子类SubBase类中的subbase;而基类里面并没有实现正确赋值,因为你没有显示的调用基类的的这Copy构造函数,没有显示调用,编译器就会默认使用无参构造函数进行初始化。 调用到copy assignment函数时是对基类的所有东西不做任何操作。 怎么办? SubBase::SubBase(SubBase &subbase)// : Base(subbase); ,subage(subbase . subage) { } SubBase& SubBase::operator=(const SubBase& subbase) { subage = subbase . subbase; Base::operator=(subbase);//基类有private类型的量,无法直接调用。 return *this; } 在 C++ 中,赋值和拷贝是不同的, 拷贝构造函数是对未初始化的内存进行初始化操作 而赋值是对现有的已经初始化的对象进行操作。(这里我对“已经初始化”的理解是已经调用了构造函数,并且构造函数体可以未执行,只要调用到即可) 相关资源:Java 面经手册·小傅哥(公众号:bugstack虫洞栈).pdf
转载请注明原文地址: https://www.6miu.com/read-4931328.html

最新回复(0)