深入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++中复制构造函数和赋值操作符
先看一个例子: 定义了一个类:
随机推荐
- linux中软链接和硬链接的区别与小结
ln命令 该命令在文件之间创建链接.这种操作实际上是给系统中已有的某个文件指定另外一个可用于访问它的名称.对于这个新的文件名,我们可以为之指定不同的访问权限,以控制对信息的共享和安全性的问题. 如果链 ...
- C#面向对象中类的静态成员与非静态成员的区别
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- 初识A*算法
写这篇文章的初衷是应一个网友的要求,当然我也发现现在有关人工智能的中文站点实在太少,我在这里抛砖引玉,希望大家都来热心的参与. 还是说正题,我先拿A*算法开刀,是因为A*在游戏中有它很典型的用法,是人 ...
- Laravel教程 二:路由,视图,控制器工作流程
Laravel教程 二:路由,视图,控制器工作流程 此文章为原创文章,未经同意,禁止转载. View Controller 上一篇教程我们走了那么长的路,终于把Laravel安装好了,这一篇教程我们就 ...
- Recruit Coupon Purchase Winner's Interview: 2nd place, Halla Yang
Recruit Coupon Purchase Winner's Interview: 2nd place, Halla Yang Recruit Ponpare is Japan's leading ...
- SSH协议及其应用
SSH协议及其应用 原文作者:阮一峰 链接: http://www.ruanyifeng.com/blog/2011/12/ssh_remote_login.html http://www.ruany ...
- B/S C/S架构的界面测试
网站是B/S架构的典型,从做网站的有限经验来整理一下B/S测试的基本要点,并把它与C/S进行区分. 与C/S相比,以下4个测试是除了常用测试外还要注意的: (1)链接测试 (2)表单测试 (3)脚本测 ...
- block与函数指针有什么区别
block就是一个代码块,但是它的神奇之处在于在内联(inline)执行的时候(这和C++很像)还可以传递参数.同时block本身也可以被作为参数在方法和函数间传递,这就给予了block无限的可能. ...
- _AR="ar" _ARFLAGS="-ruv"
_AR="ar" _ARFLAGS="-ruv" 详情看GCC详解, 表3.14 Makefile中常见预定义变量 命 令 格 式 含义 AR 库文件维护程序的 ...
- php 开启curl,重启php-fpm服务
1,找到php.ini配置 find / -name 'php.ini' /usr/local/php/etc/php.ini 找到extension=php_curl.dll 把前面的分号去掉即可. ...