`

C++拷贝赋值函数

    博客分类:
  • C++
阅读更多
运用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++ 拷贝构造函数 赋值构造函数 解释

    详解C++ 拷贝构造函数和赋值运算符

    本文主要介绍了拷贝构造函数和赋值运算符的区别,以及在什么时候调用拷贝构造函数、什么情况下调用赋值运算符。最后,简单的分析了下深拷贝和浅拷贝的问题。有需要的朋友可以看下

    详解C++中构造函数,拷贝构造函数和赋值函数的区别和实现

    C++中一般创建对象,拷贝或赋值的方式有构造函数,拷贝构造函数,赋值函数这三种方法。下面就详细比较下三者之间的区别以及它们的具体实现 1.构造函数 构造函数是一种特殊的类成员函数,是当创建一个类的对象时,它...

    C++拷贝构造函数和赋值操作

    C++拷贝构造函数和赋值操作 拷贝构造函数对同一个对象来说只会调用一次,而且是在对象构造时调用。此时对象本身还没有构造,无需要去释放自己的一些资源。而赋值操作可能会调用多次,你在拷贝之前要释放自己的一些...

    C++实现 类string的 普通构造函数, 拷贝构造函数 析构函数 和赋值函数

    C++实现 类string的 普通构造函数, 拷贝构造函数 析构函数 和赋值函数

    C++ 赋值构造函数注意点介绍

    您可能感兴趣的文章:浅谈c++构造函数问题,初始化和赋值问题详解C++ 拷贝构造函数和赋值运算符详解C++中对构造函数和赋值运算符的复制和移动操作C++中复制构造函数和重载赋值操作符总结深入C++中构造函数、拷贝构造...

    详解C++ 编写String 的构造函数、拷贝构造函数、析构函数和赋值函数

    主要介绍了详解C++ 编写String 的构造函数、拷贝构造函数、析构函数和赋值函数的相关资料,这里提供实例帮助大家理解掌握这部分内容,需要的朋友可以参考下

    C++智能指针实现(包含拷贝构造,赋值函数,引用解引用重载)

    C++智能指针实现(包含拷贝构造,赋值函数,引用解引用重载) 帮助初学者掌握智能指针的实现原理,采用引用计数方式实现

    C++中拷贝构造函数的总结详解

    1.什么是拷贝构造函数: 拷贝构造函数嘛,当然就是拷贝和构造了。(其实很多名字,只要静下心来想一想,就真的是顾名思义呀)拷贝又称复制,因此拷贝构造函数又称复制构造函数。百度百科上是这样说的:拷贝构造函数...

    C++ — 构造函数 赋值函数 拷贝构造函数

    1. 类的声明,构造函数,拷贝构造函数,赋值函数 代码实现 class String { public: String(const char* initChar); String(const String& str); String& operator = (const String& str); private: char*...

    C++复制(拷贝)构造函数实验代码

    C++复制(拷贝) 构造函数实验代码 每个类只有一个析构函数 和一个赋值函数 ,但可以有多个构造函数 (包含一个拷贝构造函数 ,其它的称为普通构造函数 )。对于任意一个类 A ,如果不想编写上述函数, C++ 编译器将...

    c++中拷贝构造函数的参数类型必须是引用

    在C++中, 构造函数,拷贝构造函数,析构函数和赋值函数(赋值运算符重载)是最基本不过的需要掌握的知识。 但是如果我问你“拷贝构造函数的参数为什么必须使用引用类型?”这个问题, 你会怎么回答? 或许你会回答...

    详解c/c++赋值函数(重载=号运算符)

    首先c++里的各种运算符都是用函数实现的,比如=,就等号函数。 所以当用=给一个对象赋值的时候,实际调用的是=号所对应的=号函数。 分析下面的代码 #include using namespace std; class Test{ public: explicit ...

    C++ 中类的拷贝、赋值、销毁的实例详解

    类的拷贝赋值运算符。 类的析构。 好了one by one 如果我们没有定义类的拷贝构造函数的话,那么编译器会为我们合成默认拷贝构造函数—-合成拷贝构造函数。 和成拷贝构造函数的操作是将其参数的各个成员拷贝到正在...

    深入C++中构造函数、拷贝构造函数、赋值操作符、析构函数的调用过程总结

    用同一个类的源对象构造一个目标对象时,会调用拷贝构造函数来构造目标对象,如果没有定义拷贝构造函数,将调用类的默认拷贝函数来构造目标对象。2 . 当一个函数的返回值为一个类的对象时,如果在调用函数中,没有...

    NDK13_C++基础:构造函数、拷贝构造函数、浅拷贝与深拷贝.zip

    C++中 这个语句执行完毕,在当前的堆内存内 初始化并且赋值好该对象 在java中执行这个语句,只是开辟了一块内存空间,并没初始化和赋值对象, 必须用new关键字,来进行初始化和赋值 ——————————————...

    高质量C++/C编程指南

    第7章 内存管理 44 7.1内存分配方式 44 ...9.6 示例:类STRING的拷贝构造函数与赋值函数 73 9.7 偷懒的办法处理拷贝构造函数与赋值函数 75 9.8 如何在派生类中实现类的基本函数 75 9.9 一些心得体会 77

Global site tag (gtag.js) - Google Analytics