拷贝构造函数 和 赋值操作符重载

什么时候需要定义自己的拷贝构造函数:

当类中包含有,动态分配成员 或者 指针 的时候。 如果使用默认构造函数,则新构造出来的 新类 和 旧类 里面的指针成员 指向同一个空间, 而当其中一个类 清空掉那个空间 。另一个类的指针就会变成野指针(因为空间已经被清空) , 也就是说默认构造函数是复制值(地址也是值) ps.基本数据类型的数组可以直接使用默认复制构造函数。也就是说有涉及到 自行开辟额外空间 的数据类型 和 指针 的类就需要

什么时候调用拷贝构造函数:

1.一个对象以 值传递 的方式 传入 一个函数

ps: 拷贝构造函数 的形参 必须是 引用,  因为 当对象形参以 值传递 形式 传入 函数时, 会创建一个临时变量 复制对象形参,这个时候又是一样的步骤。创建临时变量。最终堆栈溢出 。     而当传入的是 对象引用 时,函数可以直接使用对象,无需创建新对象。不会造成递归堆栈溢出。(const 可以没有。但最好有。限定只读,并且 const变量不能随意转化为非const,如果传入的是const变量,而形参类型非const,则转化错误)

2.一个对象以 值传递 的方式 从函数 返回

3.一个对象给 另一个对象 初始化的时候

ps: test 是类名, q是已经初始化过的 对象

test k(q) 和 test k = q 调用的拷贝构造函数。因为k是一个未定义的对象

当k定义过了。 调用的则是 = 号操作符

test k;     //先定义了(默认构造函数初始化基本类型成员)

k = q;    //调用 = 操作符

浅拷贝: 只是简单的值复制。数组也同样有效

深拷贝: 为指针所指向的。 另外开辟新的内存空间并复制 。 拷贝和被拷贝的对象。成员指针指向 包含同一值的。不同内存空间

拷贝构造函数:

声明: test( const test & cpy)

类外定义:  test:: test(const test &cpy)

赋值操作符重载

声明:test& test::operate = (const test & cpy)

类外定义: test& test:: operate = (const test & cpy)

两者区别 : 根据是否生成新对象 。 如果是生成对象,则调用复制构造函数 。 如果对象已经有了。则调用 赋值函数

因此两者所定义的内容也应该有所区别。   复制构造函数针对一个 空的对象。 含有指向内存空间的东西都应该另外开辟新空间

赋值函数针对一个 已经存在的对象, 要将原来的成员重新赋值(如果有旧的),并且删除旧的(检查是否是自赋值,释放原有空间,分配新的内存资源,并复制,。返回本对象的引用)

时间: 2024-11-10 07:55:47

拷贝构造函数 和 赋值操作符重载的相关文章

拷贝构造函数和赋值操作符

假设有一个如下的MyClass类: class MyClass { public: //构造函数 //拷贝构造函数 MyClass(const MyClass& that) : int_data_(that.int_data_), dbl_data_(that.dbl_data_), str_data_(that.str_data_) { } //赋值操作符 MyClass& operator = (const MyClass& that) { if(this != that) {

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

转自 http://www.jb51.net/article/37527.htm,感谢作者 #include "stdafx.h"      #include <iostream>      using namespace std;      class B      {      public:          B():data(0)    //默认构造函数          {               cout << "Default con

构造函数、拷贝构造函数、赋值操作符

对于这样一种类与类之间的关系,我们希望为其编写“深拷贝”.两个类的定义如下: class Point { int x; int y; }; class Polygon : public Shape { Point *points; }; 1. 构造函数 //构造函数 Polygon(const Point &p) : _point(new Point) { this->_point->x = p.x; this->_point->y = p.y; } 2. 拷贝构造函数 /

拷贝构造函数和赋值函数

在 C++ 中,赋值和拷贝是不同的, 1)拷贝构造函数是对未初始化的内存进行初始化操作 2)而赋值是对现有的已经初始化的对象进行操作.(这里我对"已经初始化"的理解是已经调用了构造函数,并且构造函数体可以未执行,只要调用到即可),赋值函数应该给所有数据成员都初始化. 3)重点:包含动态分配成员的类 应提供拷贝构造函数,并重载"="赋值操作符. 4)可以说,C++中什么时候有临时对象产生,此时刻c++一定要调用拷贝构造函数.(临时对象产生时有一个特例,此时不需要调用拷

拷贝构造函数和赋值函数的一些知识

/*******************拷贝构造函数和赋值运算符重载有以下两个不同之处***************************/ 1.拷贝构造函数生成新的类对象,而赋值运算符不能. 2.由于拷贝构造函数是直接构造一个新的类对象,所以在初始化这个对象之前不用检验源对象是否和新对象相同,而复制操作符需要这个操作,另外赋值运算符中如果原来对象中有内存分配,要先把内存释放掉. 下面是String类的一个实现的部分函数,可以看出二者的区别. 1 class String{ 2 public:

拷贝构造函数与赋值函数的区别

1.从概念上区分:复制构造函数是构造函数,而赋值操作符属于操作符重载范畴,它通常是类的成员函数 2.从原型上来区分:复制构造函数原型ClassType(const ClassType &);无返回值赋值操作符原型ClassType& operator=(const ClassType &);返回值为ClassType的引用,便于连续赋值操作 3.从使用的场合来区分:复制构造函数用于产生对象,它用于以下几个地方:函数参数为类的值类型时.函数返回值为类类型时以及初始化语句,例如(示例了

拷贝构造函数(三)——重载赋值运算符

拷贝构造函数(一)--哲学三连:http://www.cnblogs.com/tenjl-exv/p/8017814.html 拷贝构造函数(二)--深拷贝与浅拷贝:http://www.cnblogs.com/tenjl-exv/p/8017909.html 拷贝构造函数(三)--重载赋值运算符:http://www.cnblogs.com/tenjl-exv/p/8017983.html 关于拷贝函数中的赋值操作符重载  以下讨论中将用到的例子: 1 class CExample 2 { 3

C++ 拷贝构造函数与赋值函数的区别(很严谨和全面)

这里我们用类String 来介绍这两个函数: 拷贝构造函数是一种特殊构造函数,具有单个形参,该形参(常用const修饰)是对该类类型的引用.当定义一个新对象并用一个同类型的对象对它进行初始化时,将显式使用拷贝构造函数.为啥形参必须是对该类型的引用呢?试想一下,假如形参是该类的一个实例,由于是传值参数,我们把形参复制到实参会调用拷贝构造函数,如果允许拷贝构造函数传值,就会在拷贝构造函数内调用拷贝构造函数,从而形成无休止的递归调用导致栈溢出. 赋值函数,也是赋值操作符重载,因为赋值必须作为类成员,那

C++ Primer 学习笔记_54_类与数据抽象 --复制构造函数、赋值操作符

复制控制 --复制构造函数.赋值操作符 引言: 当定义一个新类型时,需要显式或隐式地指定复制.赋值和撤销该类型的对象时会发生什么– 复制构造函数.赋值操作符和析构函数的作用!      复制构造函数:具有单个形参,该形参(常用const修饰)是对该类类型的引用.当定义一个新对象并用一个同类型的对象对它进行初始化时,将显式的使用复制构造函数:当将该类型的对象传递给函数或者从函数返回该类型的对象时,将隐式使用复制构造函数.     析构函数:作为构造函数的互补,当对象超出作用域或动态分配的对象被删除