• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C语言 > C++中复制构造函数和重载赋值操作符总结

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

作者:果冻想 字体:[增加 减小] 来源:互联网 时间:2017-05-28

果冻想 通过本文主要向大家介绍了c++复制构造函数,c++中构造函数,c++调用构造函数,c++构造函数,c++拷贝构造函数等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

前言

这篇文章将对C++中复制构造函数和重载赋值操作符进行总结,包括以下内容:

1.复制构造函数和重载赋值操作符的定义;
2.复制构造函数和重载赋值操作符的调用时机;
3.复制构造函数和重载赋值操作符的实现要点;
4.复制构造函数的一些细节。

复制构造函数和重载赋值操作符的定义

我们都知道,在C++中建立一个类,这个类中肯定会包括构造函数、析构函数、复制构造函数和重载赋值操作;即使在你没有明确定义的情况下,编译器也会给你生成这样的四个函数。例如以下类:
class CTest
{
public:
     CTest();
     ~CTest();
 
     CTest(const CTest &);
     void operator=(const CTest &);
};
</div>
对于构造函数和析构函数不是今天总结的重点,今天的重点是复制构造函数和重载赋值操作。类的复制构造函数原型如下:
class_name(const class_name &src);
</div>
一般来说,如果我们没有编写复制构造函数,那么编译器会自动地替每一个类创建一个复制构造函数(也叫隐式复制构造函数);相反的,如果我们编写了一个复制构造函数(显式的复制构造函数),那么编译器就不会创建它。

类的重载赋值操作符的原型如下:
void operator=(const class_name &);
</div>

重载赋值操作符是一个特别的赋值运算符,通常是用来把已存在的对象指定给其它相同类型的对象。它是一个特别的成员函数,如果我们没有定义这个成员函数,那么编译器会自动地产生这个成员函数。编译器产生的代码是以单一成员进行对象复制的动作。

总结了复制构造函数和重载赋值操作符的定义,只是让我们了解了它们,而没有真正的深入它们。接下来,再仔细的总结一下它们的调用时机。关于它们的调用时机,我一直都没有真正的明白过,所以这里一定要好好的总结明白了。

复制构造函数和重载赋值操作符的调用时机

对复制构造函数和重载赋值操作符的调用总是发生在不经意间,它们不是经过我们显式的去调用就被执行了。对于这种隐式调用的地方一定要多注意了,这也一般是有陷阱的地方。现在我就用实际的例子来进行验证;例子如下:
#include <iostream>
using namespace std;
 
class CTest
{
public:
     CTest(){}
     ~CTest(){}
 
     CTest(const CTest &test)
     {
          cout<<"copy constructor."<<endl;
     }
 
     void operator=(const CTest &test)
     {
          cout<<"operator="<<endl;
     }
 
     void Test(CTest test)
     {}
 
     CTest Test2()
     {
          CTest a;
          return a;
     }
 
     void Test3(CTest &test)
     {}
 
     CTest &Test4()
     {
          CTest *pA = new CTest;
          return *pA;
     }
};
 
int main()
{
     CTest obj;
 
     CTest obj1(obj); // 调用复制构造函数
 
     obj1 = obj; // 调用重载赋值操作符
 
     /* 传参的过程中,要调用一次复制构造函数
     * obj1入栈时会调用复制构造函数创建一个临时对象,与函数内的局部变量具有相同的作用域
     */
     obj.Test(obj1);
 
     /* 函数返回值时,调用复制构造函数;将返回值赋值给obj2时,调用重载赋值操作符
     * 函数返回值时,也会构造一个临时对象;调用复制构造函数将返回值复制到临时对象上
     */
     CTest obj2;
     obj2 = obj.Test2();
 
     obj2.Test3(obj); // 参数是引用,没有调用复制构造函数
 
     CTest obj3;
     obj2.Test4(); // 返回值是引用,没有调用复制构造函数
 
     return 0;
}
</div>

在代码中都加入了注释,这里就不再做详细的说明了。再次总结一下,如果对象在声明的同时将另一个已存在的对象赋给它,就会调用复制构造函数;如果对象已经存在了,然后再将另一个已存在的对象赋给它,调用的就是重载赋值运算符了。这条规则很适用,希望大家能记住。

复制构造函数和重载赋值操作符的实现要点

在一般的情况下,编译器给我们生成的默认的复制构造函数和重载赋值操作符就已经够用了;但是在一些特别的时候,需要我们手动去实现自己的复制构造函数。

我们都知道,默认的复制构造函数和赋值运算符进行的都是”shallow copy”,只是简单地复制字段,因此如果对象中含有动态分配的内存,就需要我们自己重写复制构造函数或者重载赋值运算符来实现”deep copy”,确保数据的完整性和安全性。这也就是大家常常说的深拷贝与浅拷贝的问题。下面我就提供一个比较简单的例子来说明一下:
#include <iostream>
using namespace std;
 
const int MAXSIZE = 260;
 
class CTest
{
public:
     CTest(wchar_t *pInitValue)
     {
          // Here, I malloc the memory
          pValue = new wchar_t[MAXSIZE];
          memset(pValue, 0, sizeof(wchar_t) * MAXSIZE);
          wcscpy_s(pValue, MAXSIZE, pInitValue);
     }
 
     ~CTest()
     {
          if (pValue)
          {
               delete[] pValue; //finalseabiscuit指出,谢谢。2014.7.24
               pValue = NULL;
          }
     }
 
     CTest(const CTest &test)
     {

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • C++ 构造函数中使用new时注意事项
  • C++ 赋值构造函数注意点介绍
  • c++ 构造函数中调用虚函数的实现方法
  • C++ 类的构造函数详解及实例
  • 解析C++中构造函数的默认参数和构造函数的重载
  • 深入讲解C++中的构造函数
  • C++中构造函数重载
  • C++中复制构造函数和重载赋值操作符总结
  • C++构造函数初始化顺序详解
  • c++ 构造函数的初始化列表

相关文章

  • 2017-05-288皇后问题的解法实例代码
  • 2017-05-28详解C语言gets()函数与它的替代者fgets()函数
  • 2017-05-28如何在二叉树中找出和为某一值的所有路径
  • 2017-05-28浅谈Linux环境下并发编程中C语言fork()函数的使用
  • 2017-05-28C/C++函数调用栈的实现方法
  • 2017-05-28详解C++编程的多态性概念
  • 2017-05-28C语言 扫雷程序的实现
  • 2017-05-28C++的sstream标准库详细介绍
  • 2017-05-28常用C/C++预处理指令详解
  • 2017-05-28深入java线程池的使用详解

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • C语言嵌入informix基础入门示例讲解
    • C++中vector容器的用法
    • typedef和#define的用法以及区别
    • 指针操作数组的两种方法(总结)
    • C++流操作之fstream用法介绍
    • C语言 数据结构堆排序顺序存储(升序)
    • c++动态内存空间示例(自定义空间类型大小和空间长度)
    • OLEDB打开Excel文件的实现方法
    • C++入门之基础语法学习教程
    • 使用C语言构建基本的二叉树数据结构

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有