`
xiaoheliushuiya
  • 浏览: 404186 次
文章分类
社区版块
存档分类
最新评论

C++ 拷贝构造函数(即复制构造函数)和赋值运算符重载(有说赋值构造函数)区别

 
阅读更多

如果不主动编写拷贝构造函数和赋值函数,编译器将以“位拷贝”的方式自动生成缺省的函数。

倘若类中含有指针变量,那么这两个缺省的函数就隐含了错误。以类String 的两个对象a,b 为例,假设a.m_data 的内容为“hello”,b.m_data 的内容为“world”。现将a 赋给b,缺省赋值函数的“位拷贝”意味着执行b.m_data = a.m_data。这将造成三个错误:一是b.m_data 原有的内存没被释放,造成内存泄露;二是b.m_data 和a.m_data 指向同一块内存,a 或b 任何一方变动都会影响另一方;三是在对象被析构时,m_data 被释放了两次

拷贝构造函数和赋值函数非常容易混淆,常导致错写、错用。拷贝构造函数是在对象被创建时调用的,而赋值函数只能被已经存在了的对象调用

具体示例:

#include <iostream>

using namespace std;
class A{
private:
	int num;
public:
	A(){
	   cout<<"这是默认构造函数"<<endl;

	   }
	A(const A &a){
	 cout<<"这是拷贝构造函数"<<endl;
	}
	A& operator=(const A &a){
	 cout<<"这是赋值重载"<<endl;
	 return *this;
	}
};
void main(){
  A a;
  A b(a);
  A c=b;
  c=a;
}
运行结果:




分享到:
评论

相关推荐

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

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

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

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

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

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

    C++运算符重载的思维导图

    运算符重载 、运算符重载规则 ...2.重载赋值运算符 ①条件 ②代码 3.重载运算符[和O) 前提 ②重载下标运算符[ ③重载函数调用符 0④重载流插入和流提取运算符 a.前提 四、类类型转换 1.构造函数构造 2.类型转换函数

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

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

    实验项目五:类和对象_实验项目六:运算符重载.zip

    实验项目五:类和对象 实验项目六:运算符重载

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

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

    运算符重载

    C++运算符重载:自定义类的赋值运算符重载函数的作用与内置赋值运算符的作用类似,但是要注意的是,它与拷贝构造函数与析构函数一样,要注意深拷贝浅拷贝的问题,在没有深拷贝浅拷贝的情况下,如果没有指定默认的...

    C++中复制构造函数和重载赋值操作符总结

    这篇文章将对C++中复制构造函数和重载赋值操作符进行总结,包括以下内容: 1.复制构造函数和重载赋值操作符的定义; 2.复制构造函数和重载赋值操作符的调用时机; 3.复制构造函数和重载赋值操作符的实现要点; 4....

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

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

    面向对象程序设计C++运算符重载

    2. 实现拷贝构造函数,即用一个已有的颜色来构造一个新的颜色对象。 3. 用运算符重载的方式运算。 4. 在上述运算过程中,实现颜色值的边界检查,即运算过程中,某个颜色分量值大于255,则直接赋值255,如果值小于0,...

    C++中复制构造函数与重载赋值操作符的深入分析

    在C++中复制控制是一个比较重要的话题,主要包括复制构造函数、重载赋值操作符、析构函数这三部分,这三个函数是一致的,如果需要手动定义了其中了一个,那么另外的两个也需要定义,通常在存在指针或者前期相关操作...

    C++中对象的赋值与复制操作详细解析

    本来赋值运算符“=”只能用来对单个的变量赋值,现在被扩展为两个同类对象之间的赋值,这是通过对赋值运算符的重载实现的。 实际上这个过程是通过成员复制来实现的,即将一个对象的成员值一一复制给另外一个对象的...

    C++继承

    子类的默认成员函数 ...显示定义的赋值运算符重载, 会和父类的赋值运算符重载函数同名, 形成隐藏 析构函数: 在底层都是 : destructor * 会造成同名隐藏 子类析构不要调用父类的析构 菱形继承 : 数据冗余 二义性(钻石

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

    首先c++里的各种运算符都是用函数实现的,比如=,就等号函数。 所以当用=给一个对象赋值的时候,实际调用的是=号所对应的=号函数。 分析下面的代码 ... //拷贝构造函数 Test(const Test &t){ cout &lt;&lt; Co

    网二维数组的动态创建和释放.pdf 网负号重载(1).pdf 网负号重载pdf 赋值号“==“重载(1).pdf 赋值号"==

    网二维数组的动态创建和释放.pdf 网负号重载(1).pdf 网负号重载pdf 赋值号“==“重载(1).pdf 赋值号"== “重载.pdf 构造函数可以调用虚函数吗, 析构函数可... ...网重载赋值号的问题?为什么不能自赋值1...

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

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

    有理分数的四则算术运算符重载 .cpp

    提供一个构造函数,使该类的对象能够在声明时进行初始化。构造函数应以简化形式存储分数。分数 2/4 等价于 1/2,并将作为分子中的 1 和分母中的 2 存储在对象中。 如果没有提供初始值设定项,请提供默认值为 1 的无...

Global site tag (gtag.js) - Google Analytics