专栏首页xingoo, 一个梦想做发明家的程序员析构函数-复制构造函数-赋值操作符重载-默认构造函数<代码解析>

析构函数-复制构造函数-赋值操作符重载-默认构造函数<代码解析>

通过下面primer中的一道习题,可以更深刻的了解,析构函数,复制构造函数,赋值操作符重载,默认构造函数的使用。

但是我的结果与primer习题解答里面的并不相同,可能是编译器不同的原因导致。

// test1107.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>
#include <vector>
using namespace std;

struct Exam{
    Exam(){ cout<<"Exam()"<<endl;} //默认构造函数
    Exam(const Exam&){ cout<<"Exam(const Exam&)"<<endl;} //复制构造函数
    Exam& operator= (const Exam&){ cout<<"Exam& operator"<<endl;return *this;} //赋值操作符
    ~Exam(){ cout<<"~Exam()"<<endl;}//析构函数
};

void func1(Exam a){}//形参为 exam的对象
void func2(Exam& b){}//形参为 exam的引用
Exam func3(){Exam obj;return obj;} //返回exam的对象


int main(){
    cout<<"--------------------1----------------"<<endl;
    Exam a; //调用默认的构造函数创建对象a
    cout<<"--------------------2----------------"<<endl;
    func1(a);// 调用复制构造函数,创建副本传递实参,撤销副本
    cout<<"--------------------3----------------"<<endl;
    func2(a); //形参为引用,无需传递实参
    cout<<"--------------------4----------------"<<endl;
    a = func3(); //调用默认构造函数创建局部对象,
                //用复制构造函数返回对象副本
                //调用析构函数撤销局部对象
                //调用赋值函数赋值
                //调用析构函数撤销副本
    cout<<"--------------------5----------------"<<endl;
    Exam *b = new Exam(); //调用默认构造函数创建对象
    cout<<"--------------------6----------------"<<endl;
    vector<Exam> exec(3); //调用默认构造函数创建对象
                        //调用赋值构造函数将临时对象复制到每个元素
                        //调用析构函数撤销

                        //重复三次
    cout<<"--------------------7----------------"<<endl;
    delete b; //调用析构,撤销p
    cout<<"--------------------8----------------"<<endl;
    system("pause");
}

执行结果如下:

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • HDOJ 1012

    水题天天有,今天特别多....嘿嘿 u Calculate e Time Limit: 2000/1000 MS (Java/Others) Memor...

    用户1154259
  • VS报错:DEBUG Assertion Failed!

    使用vs2010时,遇到如下错误 ? 然后点击继续后: ? 点击终止: ? 观察变量: ? 根据提示发现,有可能是断点问题,于是猜想可能是指针的错误。 goog...

    用户1154259
  • 【Spring实战】—— 4 Spring中bean的init和destroy方法讲解

    本篇文章主要介绍了在spring中通过配置init-method和destroy-method方法来实现Bean的初始化和销毁时附加的操作。 在java中,...

    用户1154259
  • volatile 回忆篇

    volatile->可见性、有序性->happens-before原则、volatile内存语义(结合JMM理解) happens-before原则>禁止指令...

    平凡的学生族
  • 腾讯WeTest获三项ISO国际认证,构建顶尖全球化品质标准

    ?   2020年8月1日,国际权威认证机构DNV GL为腾讯旗下质量开放平台腾讯WeTest颁发了ISO9001质量管理体系、ISO27001信息安全管理体...

    WeTest质量开放平台团队
  • 腾讯WeTest获三项ISO国际认证,构建顶尖全球化品质标准

    2020年8月1日,国际权威认证机构DNV GL为腾讯旗下质量开放平台腾讯WeTest颁发了ISO9001质量管理体系、ISO27001信息安全管理体系、ISO...

    WeTest质量开放平台团队
  • Socket、Http、WebSocket?强大的Netty几行语句就帮你实现!

    Netty是目前最流行的由JBOSS提供的一个Java开源框架NIO框架,Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的...

    品茗IT
  • Huginn安装教程—建立你自己的IFTTT

    首先,Huginn是一款开源应用(开源赛高!!!),这是它的Github地址,有上万的star(经常混Github的人应该都知道,上万的star意味着这个开源应...

    huginn 中文网
  • SYN4631型PCIe转串口授时卡

    SYN4631型PCIe转串口授时卡是西安同步电子科技有限公司研发生产的一款通过PCIe总线转换为串口为计算机、工控机等操作系统提供高精度授时的时钟卡。该授时卡...

    时频专家
  • 动态 | NVIDIA 迁移学习工具包 :用于特定领域深度学习模型快速训练的高级SDK

    AI 科技评论按:NVIDIA 迁移学习工具包对于深度学习应用开发人员和数据科学家来说是理想的工具,这些开发人员和数据科学家正在为各种行业垂直领域(如智能视频分...

    AI科技评论

扫码关注云+社区

领取腾讯云代金券