运用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++ 中,赋值和拷贝是不同的,
拷贝构造函数是对未初始化的内存进行初始化操作
而赋值是对现有的已经初始化的对象进行操作。(这里我对“已经初始化”的理解是已经调用了构造函数,并且构造函数体可以未执行,只要调用到即可)
分享到:
相关推荐
C++ 拷贝构造函数 赋值构造函数 解释
本文主要介绍了拷贝构造函数和赋值运算符的区别,以及在什么时候调用拷贝构造函数、什么情况下调用赋值运算符。最后,简单的分析了下深拷贝和浅拷贝的问题。有需要的朋友可以看下
C++中一般创建对象,拷贝或赋值的方式有构造函数,拷贝构造函数,赋值函数这三种方法。下面就详细比较下三者之间的区别以及它们的具体实现 1.构造函数 构造函数是一种特殊的类成员函数,是当创建一个类的对象时,它...
C++拷贝构造函数和赋值操作 拷贝构造函数对同一个对象来说只会调用一次,而且是在对象构造时调用。此时对象本身还没有构造,无需要去释放自己的一些资源。而赋值操作可能会调用多次,你在拷贝之前要释放自己的一些...
C++实现 类string的 普通构造函数, 拷贝构造函数 析构函数 和赋值函数
您可能感兴趣的文章:浅谈c++构造函数问题,初始化和赋值问题详解C++ 拷贝构造函数和赋值运算符详解C++中对构造函数和赋值运算符的复制和移动操作C++中复制构造函数和重载赋值操作符总结深入C++中构造函数、拷贝构造...
主要介绍了详解C++ 编写String 的构造函数、拷贝构造函数、析构函数和赋值函数的相关资料,这里提供实例帮助大家理解掌握这部分内容,需要的朋友可以参考下
C++智能指针实现(包含拷贝构造,赋值函数,引用解引用重载) 帮助初学者掌握智能指针的实现原理,采用引用计数方式实现
1.什么是拷贝构造函数: 拷贝构造函数嘛,当然就是拷贝和构造了。(其实很多名字,只要静下心来想一想,就真的是顾名思义呀)拷贝又称复制,因此拷贝构造函数又称复制构造函数。百度百科上是这样说的:拷贝构造函数...
1. 类的声明,构造函数,拷贝构造函数,赋值函数 代码实现 class String { public: String(const char* initChar); String(const String& str); String& operator = (const String& str); private: char*...
C++复制(拷贝) 构造函数实验代码 每个类只有一个析构函数 和一个赋值函数 ,但可以有多个构造函数 (包含一个拷贝构造函数 ,其它的称为普通构造函数 )。对于任意一个类 A ,如果不想编写上述函数, C++ 编译器将...
在C++中, 构造函数,拷贝构造函数,析构函数和赋值函数(赋值运算符重载)是最基本不过的需要掌握的知识。 但是如果我问你“拷贝构造函数的参数为什么必须使用引用类型?”这个问题, 你会怎么回答? 或许你会回答...
首先c++里的各种运算符都是用函数实现的,比如=,就等号函数。 所以当用=给一个对象赋值的时候,实际调用的是=号所对应的=号函数。 分析下面的代码 #include using namespace std; class Test{ public: explicit ...
类的拷贝赋值运算符。 类的析构。 好了one by one 如果我们没有定义类的拷贝构造函数的话,那么编译器会为我们合成默认拷贝构造函数—-合成拷贝构造函数。 和成拷贝构造函数的操作是将其参数的各个成员拷贝到正在...
用同一个类的源对象构造一个目标对象时,会调用拷贝构造函数来构造目标对象,如果没有定义拷贝构造函数,将调用类的默认拷贝函数来构造目标对象。2 . 当一个函数的返回值为一个类的对象时,如果在调用函数中,没有...
C++中 这个语句执行完毕,在当前的堆内存内 初始化并且赋值好该对象 在java中执行这个语句,只是开辟了一块内存空间,并没初始化和赋值对象, 必须用new关键字,来进行初始化和赋值 ——————————————...
第7章 内存管理 44 7.1内存分配方式 44 ...9.6 示例:类STRING的拷贝构造函数与赋值函数 73 9.7 偷懒的办法处理拷贝构造函数与赋值函数 75 9.8 如何在派生类中实现类的基本函数 75 9.9 一些心得体会 77