深入C++中构造函数、拷贝构造函数、赋值操作符、析构函数的调用过程总结
转自 http://www.jb51.net/article/37527.htm,感谢作者
#include "stdafx.h"  
    #include <iostream>  
    using namespace std;  
    class B  
    {  
    public:  
        B():data(0)    //默认构造函数  
        {   
            cout << "Default constructor is called." << endl;  
        }  
        B(int i):data(i) //带参数的构造函数  
        {  
            cout << "Constructor is called." << data << endl;  
        }  
        B(B &b)   // 复制(拷贝)构造函数  
        {  
            data = b.data; cout << "Copy Constructor is called." << data << endl;  
        }  
        B& operator = (const B &b) //赋值运算符的重载  
        {  
            this->data = b.data;  
            cout << "The operator \"= \" is called." << data << endl;  
            return *this;  
        }  
        ~B() //析构函数  
        {  
            cout << "Destructor is called. " << data << endl;  
        }  
    private:  
        int data;  
    };
//函数,参数是一个B类型对象,返回值也是一个B类型的对象  
    B fun(B b)  
    {  
        return b;  
    }
//测试函数  
    int _tmain(int argc, _TCHAR* argv[])  
    {  
        fun(1);  
        cout << endl;
B t1 = fun(2);  
        cout << endl;
B t2;  
        t2 = fun(3);
return 0;  
    }
Constructor is called.1             //用1构造参数b     
    Copy Constructor is called.1      //用b拷贝构造一个临时对象,因为此时没有对象来接受fun的返回值     
    Destructor is called. 1            //参数b被析构     
    Destructor is called. 1             //临时对象被析构  
    Constructor is called.2                  //用2构造参数b        
    Copy Constructor is called.2           //用b拷贝构造t1,此时调用的是拷贝构造函数     
    Destructor is called. 2                  //参数b被析构  
    Default constructor is called.             //调用默认的构造函数构造t2        
    Constructor is called.3                       //用3构造参数b        
    Copy Constructor is called.3             //用b拷贝构造一个临时对象        
    Destructor is called. 3                        //参数b被析构        
    The operator "= " is called.3              //调用=操作符初始化t2,此时调用的是赋值操作符     
    Destructor is called. 3                         //临时对象被析构        
    Destructor is called. 3                         //t2被析构        
    Destructor is called. 2                         //t1被析构        
    请按任意键继续. . .
Breakpoint 2, B::B (this=0x7fffffffde80, i=1) at main.cpp:11
11	        B(int i):data(i) //带参数的构造函数
(gdb) s
13	            cout << "Constructor is called." << data << endl;
(gdb) 
Constructor is called.1
14	        }
(gdb)
Breakpoint 7, main () at main.cpp:40
40	    fun(b);
(gdb)
Breakpoint 4, B::B (this=0x7fffffffde90, b=...) at main.cpp:17
17	            data = b.data; cout << "Copy Constructor is called." << data << endl;
(gdb) 
Copy Constructor is called.1
18	        }
(gdb)
Breakpoint 5, fun (b=...) at main.cpp:36
36	        return b;
(gdb)
Breakpoint 4, B::B (this=0x7fffffffdea0, b=...) at main.cpp:17
17	            data = b.data; cout << "Copy Constructor is called." << data << endl;
(gdb) 
Copy Constructor is called.1
18	        }
(gdb) 
fun (b=...) at main.cpp:37
37	    }
(gdb) 
B::~B (this=0x7fffffffdea0, __in_chrg=<optimized out>) at main.cpp:27
27	            cout << "Destructor is called. " << data << endl;
(gdb) 
Destructor is called. 1
28	        }
(gdb) 
B::~B (this=0x7fffffffde90, __in_chrg=<optimized out>) at main.cpp:27
27	            cout << "Destructor is called. " << data << endl;
(gdb) 
Destructor is called. 1
28	        }
(gdb) 
main () at main.cpp:41
41	    return 0;
(gdb)
(gdb) 
Hello World!
(gdb) 
B::~B (this=0x7fffffffde80, __in_chrg=<optimized out>) at main.cpp:27
27	            cout << "Destructor is called. " << data << endl;
(gdb) 
Destructor is called. 1
28	        }
(gdb) 
main () at main.cpp:44
深入C++中构造函数、拷贝构造函数、赋值操作符、析构函数的调用过程总结的更多相关文章
- C++中复制构造函数与重载赋值操作符总结
		前言 这篇文章将对C++中复制构造函数和重载赋值操作符进行总结,包括以下内容: 1.复制构造函数和重载赋值操作符的定义: 2.复制构造函数和重载赋值操作符的调用时机: 3.复制构造函数和重载赋值操作符 ... 
- C++中复制构造函数与重载赋值操作符
		我们都知道,在C++中建立一个类,这个类中肯定会包括构造函数.析构函数.复制构造函数和重载赋值操作:即使在你没有明确定义的情况下,编译器也会给你生成这样的四个函数.例如以下类: class CTe ... 
- C++11六大函数(构造函数,移动构造函数,移动赋值操作符,复制构造函数,赋值操作符,析构函数)
		在C++中,有三大函数复制控制(复制构造函数,赋值操作符,析构函数),而在C++11中,加入了移动构造函数,移动赋值操作符.我就斗胆将他们命名为六大函数好了. 一.构造函数 c++primer中说过: ... 
- 关于C++中的拷贝构造函数和赋值函数
		如果类定义的数据成员中存在指针或引用,那么最好重载这两个函数. 1. 定义 拷贝构造函数的定义格式:构造函数名(const 源类名& 引用对象形参名){} 赋值函数定义格式:源类名 & ... 
- C/C++中的拷贝构造函数和赋值构造函数
		代码: #include <iostream> #include <cstdio> using namespace std; class A{ public: A(){ cou ... 
- C++中的拷贝构造函数
		一.拷贝构造函数: 格式: A(const A& a); 总结: 系统为对象B分配了内存并完成了与对象testA的复制过程,就类对象而言,相同类型的类对象是通过拷贝构造函数来完成整个复制过 ... 
- 【c++ primer, 5e】构造函数 & 拷贝、赋值和析构
		[构造函数] 1.构造器就是创建对象时被调用的代码. 2.如果没有自定义构造器,那么编译器将自动合成一个默认的无参构造器. 3.自定义的构造器不允许加const,所创建const的对象只有在构造器代码 ... 
- C++构造函数 & 拷贝构造函数 & 派生类的构造函数 & 虚继承的构造函数
		构造函数 ,是一种特殊的方法 .主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中 .特别的一个类可以有多个构造函数 ,可根据其参数个数的不同或参数 ... 
- C++中复制构造函数和赋值操作符
		先看一个例子: 定义了一个类: 
随机推荐
- CSU 1115 最短的名字
			传送门 Time Limit: 5000MS Memory Limit: 65536KB 64bit IO Format: %lld & %llu Description 在一个奇怪的 ... 
- Serverlet程序
			Serverlet是用Java编写的服务器端程序;主要用于交互地浏览和修改数据,生成动态Web内容; 一个serverlet就是一个继承于HttpServlet抽象类的Java类:下面先看一个简单的例 ... 
- Oracle DBA从小白到入职实战应用
			现如今Oracle依然是RDBMS的王者,在技术上和战略上,Oracle仍然一路高歌猛进,并且全面引领行业迈入了云时代,伴随着12cR2即将在2016年正式发布,学习Oracle之路依旧任重道远,目前 ... 
- iOS开源项目汇总
			扫描wifi信息: http://code.google.com/p/uwecaugmentedrealityproject/ http://code.google.com/p/iphone-wire ... 
- Linq 中 Distinct 方法扩展
			原文链接 http://www.cnblogs.com/A_ming/archive/2013/05/24/3097062.html public static class LinqEx { publ ... 
- vagrant up时提示 Authentication failure. Retrying
			vagrant up时提示 Authentication failure. Retrying 如图,启动时就报这个错误,virtualbox启动正常 用vagrant的账号密码也可以登录 就是不能使用 ... 
- 集成学习原理:Adaboost
			集成学习通过从大量的特征中挑出最优的特征,并将其转化为对应的弱分类器进行分类使用,从而达到对目标进行分类的目的. 核心思想 它是一种迭代算法,其核心思想是针对同一个训练集训练不同的分类器(弱分类器), ... 
- ios 关联对象运用 objc_setAssociatedObject
			点按钮的时候,给alertView添加一个关联对象(被点击这个按钮), objc_setAssociatedObject(alert, &kRepresentedObject, sender, ... 
- python集合类型set
			set 类型的简单粗暴取出并集合交集 | & li=[11,22,33] n_li=[44,55] b= (list(set(li)&set(n_li))) b2=set(li) ... 
- ProcDump
			https://technet.microsoft.com/en-us/sysinternals/dd996900.aspx 
