本文用Markdown编辑,这里对Markdown的支持不完善,更好的阅读体验请移步:我的Markdown文本

C++三大函数:

  • 析构函数
  • 复制构造函数
  • operator=

析构函数

函数模样:~S()

当一个对象超出作用域或执行delete的时候,析构函数就被调用。

复制构造函数

函数模样:S(const S& s)

以下情况,复制构造函数均会被调用:

  • 声明的同时初始化:

    1. S s1 = s2; //注意此时虽然出现=,但是不是调用operator=哦
    2. S s1(s2);
  • 调用函数时使用按值传递(而不是按引用传递)

    1. void f(S s);
    2. S s1;
    3. f(s1);
  • 通过值返回对象

    1. S f()
    2. {
    3. S s1;
    4. return s1;
    5. }

operator=

函数模样:const S& operator=(const S& s)

当=应用于两个已经构造的对象时,就调用复制赋值运算符operator=。

  1. S s1;
  2. s1 = s2; //注意与S s1 = s2; 的区别

注意事项:

  1. 三大函数不手动实现的时候,会使用默认的版本。比如operator=的默认版本会依次为数据成员复制,如果是基本数据类型自然没什么问题,但当数据成员含有指针的时候,operator的只会进行浅复制,即只是指针本身被复制,而不是指针所指向的内容被复制。见下例。

    1. class S
    2. {
    3. public:
    4. int *p;
    5. S(int x=0){p=new int(x);}
    6. };
    7. void f()
    8. {
    9. S s1(2), s2;
    10. S s3 = s1;
    11. s2 = s1;
    12. *s1.p=3;
    13. cout << *s1.p << ' '<< *s2.p << ' ' << *s3.p << endl;//3 3 3
    14. }

    很明显这不是我们想要的,我们想让不同的对象的值不互相影响,此时需要实现深复制,见下例。

    1. class S
    2. {
    3. public:
    4. int *p;
    5. S(int x=0){p=new int(x);}
    6. S(const S& rhs)
    7. {
    8. p = new int(*rhs.p);
    9. }
    10. const S& operator=(const S& rhs) //rhs=right-hand side
    11. {
    12. if (this != &rhs) //检查是否复制自身
    13. *p = *rhs.p;
    14. return *this;
    15. }
    16. };
    17. void f()
    18. {
    19. S s1(2), s2;
    20. S s3 = s1;
    21. s2 = s1;
    22. *s1.p=3;
    23. cout << *s1.p << ' '<< *s2.p << ' ' << *s3.p << endl; //3 2 2
    24. }

C++三大函数(The Big Three)的更多相关文章

  1. C++类的运用 和 三大函数

    在<数据结构与算法分析C++描述>一书中给出了三段代码,简单描述了C++类的接口.实现.与调用: #ifndef INTCELL_H_INCLUDED #define INTCELL_H_ ...

  2. Golang进程权限调度包runtime三大函数Gosched、Goexit、GOMAXPROCS

    转自:https://www.cnblogs.com/wt645631686/p/9656046.html runtime.Gosched(),用于让出CPU时间片,让出当前goroutine的执行权 ...

  3. 用scheme重写Python的三大函数map reduce 和filter

    重写过程中,发现这种做法能加深对递归的理解,而且reduce还体现了函数式编程是如何通过参数传递来实现命令式编程中的状态改变的. (define (imap f x . y) (if (null? y ...

  4. Sass函数--颜色函数--RGB颜色函数

    RGB颜色函数-RGB()颜色函数 主要分为 RGB , HSL 和 Opacity 三大函数,当然其还包括一些其他的颜色函数,比如说 adjust-color 和 change-color 等.1. ...

  5. 2-4 Sass的函数功能-颜色函数

    RGB颜色函数-RGB()颜色函数 在 Sass 的官方文档中,列出了 Sass 的颜色函数清单,从大的方面主要分为 RGB , HSL 和 Opacity 三大函数,当然其还包括一些其他的颜色函数, ...

  6. C++11六大函数(构造函数,移动构造函数,移动赋值操作符,复制构造函数,赋值操作符,析构函数)

    在C++中,有三大函数复制控制(复制构造函数,赋值操作符,析构函数),而在C++11中,加入了移动构造函数,移动赋值操作符.我就斗胆将他们命名为六大函数好了. 一.构造函数 c++primer中说过: ...

  7. sass-RGB颜色函数-RGB()颜色函数

    在 Sass 的官方文档中,列出了 Sass 的颜色函数清单,从大的方面主要分为 RGB , HSL 和 Opacity 三大函数,当然其还包括一些其他的颜色函数,比如说 adjust-color 和 ...

  8. 一个上午,勉强记住了几种不同语言编译PE的启动函数

    VC:启动函数最乱,三大函数都在后面.前面8个PUSH DELPHI7:启动函数最整洁,2.3.4.2,形式排队 VB:启动函数最好记,12个0.... 汇编:三大函数距离最紧凑,除VB外,启动函数最 ...

  9. (转)浅析epoll – epoll函数深入讲解

    原文地址:http://www.cppfans.org/1418.html 浅析epoll – epoll函数深入讲解 前一篇大致讲了一下epoll是个什么东西,优点等内容,这篇延续上一篇的内容,主要 ...

随机推荐

  1. Hibernate开发环境搭建

    一.下载Hibernate包的下载 官网地址:http://hibernate.org/orm/ 下载版本:hibernate-release-4.3.11.Final 二.Hibernate jar ...

  2. ssl证书之certbot

    一.安装 1.下载压缩包:#wget https://github.com/certbot/certbot/archive/master.zip 2.解压包 3.官方文档https://github. ...

  3. Android Tint着色与帧动画结合

    需求 最近遇到一个需求: 要求根据后台接口给的色值 显示不同色值的帧动画(UI给了三张透明色的图) 正常的帧动画 是配置在xml里三张静态图片 然后加载一下就完事了现有的静态图片是透明的 还没有填充颜 ...

  4. 【转】java中抽象类与接口的区别

    转自:http://blog.chinaunix.net/uid-20586655-id-215667.html 含有abstract修饰符的class 即为抽象类,abstract类不能创建实例对象 ...

  5. Linux 静态链接库和动态连接库

    (0)文件夹 VMware 下安装Ubuntu的吐血经历 零基础学习Shell编程 Linux下的makefile的妙用 Linux调试神器 -- gdb 十分钟学会Python的基本类型 Linux ...

  6. IntelliJ IDEA15,PhpStorm10,WebStorm11激活破解

    此方法可用于激活IntelliJ IDEA15,PhpStorm10,WebStorm11等系列JetBrains产品.仅供参考,请支持正版. 最新方法:http://15.idea.lanyus.c ...

  7. 使用PostSharp在.NET平台上实现AOP

    摘自:http://www.cnblogs.com/leoo2sk/archive/2010/11/30/aop-postsharp.html 本文首先介绍AOP(面向方面编程)的相关概念及理论,然后 ...

  8. java的日期格式使用

    转自:  关于java中六个时间类的使用和区别     java.util.Date java.sql.Date  java.sql.Time  java.sql.Timestamp java.tex ...

  9. sql between写法关于查时间区间是否重叠

    --判断是否重叠 SELECT * FROM TABLEName WHERE starttime BETWEEN '2008-10-01' AND '2008-10-07' OR endtime BE ...

  10. js 判断是否为mac电脑 、还是windows操作系统

    /** * 是否为mac系统(包含iphone手机) * */ var isMac = function() { return /macintosh|mac os x/i.test(navigator ...