c++ primer 13.13练习(构造,拷贝,析构函数何时发生详解)
2017-12-04 15:14
225 查看
13.13
理解构造函数,拷贝构造函数,析构函数何时发生,最简单的一个办法就是写一个很简单的类,观察在几个情况下是否发生。
结果如下:
1.创建局部对象时,发生构造函数。
2.非引用传递参数时,从形参到实参,发生拷贝构造函数。离开函数作用域时,发生析构函数。
3.引用传递参数时,不发生拷贝构造函数,并且作用域大于此函数作域,离开函数时,不发生析构函数。
4.动态分配对象,发生构造函数。
5.添加到容器中时,实际上是将x的拷贝添加进去。所以发生拷贝构造函数。
6.释放动态分配对象,由于delete指针,将销毁指针指向的对象。故发生析构函数
7.程序结束时,发生两次析构函数。首先将局部vector<Test>中的内容销毁,发生一次析构函数,接着再销毁局部变量X,又发生一次析构函数。
值得注意的地方:
1.push_back(),实际上是添加拷贝进容器。
2.拷贝构造函数参数必须是const Test &,常量引用。否则会报错。拷贝赋值运算符同理
3.程序结束时,发生了析构函数,用vs调试运行时有可能会看不到。用cmd命令行打开debug中的exe就可以看到了。
理解构造函数,拷贝构造函数,析构函数何时发生,最简单的一个办法就是写一个很简单的类,观察在几个情况下是否发生。
#include <iostream> #include <memory> #include <string> #include <vector> using namespace std; struct Test{ Test(){ cout << "构造函数" << endl; } Test(const Test &){ cout << "拷贝构造函数" << endl; } Test& operator= (const Test&){ cout << "拷贝赋值运算符" << endl; return *this; } ~Test(){ cout << "析构函数" << endl; } }; void f1(Test x) { } void f2(Test& x) { } int main() { cout << "局部变量:" << endl; Test x; cout << endl; cout << "非引用传递参数" << endl; f1(x); cout << endl; cout << "引用传递参数" << endl; f2(x); cout << endl; cout << "动态分配对象" << endl; Test *px = new Test; cout << endl; cout << "添加到容器中" << endl; vector<Test> Vx; Vx.push_back(x); cout << endl; cout << "释放动态分配对象" << endl; delete px; cout << endl; cout << "程序结束" << endl; cout << endl; system("pause"); return 0; }
结果如下:
1.创建局部对象时,发生构造函数。
2.非引用传递参数时,从形参到实参,发生拷贝构造函数。离开函数作用域时,发生析构函数。
3.引用传递参数时,不发生拷贝构造函数,并且作用域大于此函数作域,离开函数时,不发生析构函数。
4.动态分配对象,发生构造函数。
5.添加到容器中时,实际上是将x的拷贝添加进去。所以发生拷贝构造函数。
6.释放动态分配对象,由于delete指针,将销毁指针指向的对象。故发生析构函数
7.程序结束时,发生两次析构函数。首先将局部vector<Test>中的内容销毁,发生一次析构函数,接着再销毁局部变量X,又发生一次析构函数。
值得注意的地方:
1.push_back(),实际上是添加拷贝进容器。
2.拷贝构造函数参数必须是const Test &,常量引用。否则会报错。拷贝赋值运算符同理
3.程序结束时,发生了析构函数,用vs调试运行时有可能会看不到。用cmd命令行打开debug中的exe就可以看到了。
相关文章推荐
- 构造函数和析构函数,拷贝构造,赋值重载,调用练习
- 构造函数和析构函数,拷贝构造,赋值重载,调用练习
- string函数的构造函数,析构函数,拷贝构造,赋值构造
- 类的默认成员函数,构造函数,拷贝构造,析构函数,赋值运算符重载
- String拷贝,构造和析构函数.
- big three三大函数:拷贝构造拷贝赋值析构函数
- C++ primer(十)--对象和类 共有/私有类访问、 构造/析构函数
- 号)、sex(性别)、birthday(出生日期)、id(身份证号)等等。其中“出生日期”定义为一个“日期”类内嵌子对象。用成员函数实现对人员信息的录入和显示。要求包括:构造函数和析构函数、拷贝构造函
- C++,类的构造与析构函数,进栈出栈 以及堆上的执行 顺序 语法练习
- 三大函数:拷贝构造,拷贝赋值,析构函数
- 深入了解构造函数,析构函数,拷贝构造,赋值函数的原理
- boolan第二周笔记:构造函数、拷贝构造、赋值构造、析构函数
- C++之构造函数,拷贝构造,析构函数
- C++ 构造函数、析构函数、拷贝构造、赋值运算符
- C++类的构造、拷贝构造、析构函数等
- C++:析构函数、对象生命周期、类型转换构造、拷贝构造、拷贝赋值、深浅拷贝
- C++基础3 类:构造 拷贝 析构函数 静态变量函数 const初始化列表 new delete this 面向对象模型
- 深入探索C++对象模型--详解深拷贝与浅拷贝以及拷贝构造的建构
- day05 this指针和常函数、析构函数(Destructor) 、拷贝构造和拷贝赋值
- C++【面试题】:类实现万年历(日期计算器),(含构造函数、拷贝构造、运算符重载、析构函数)