博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++学习之路: 构造函数详解与初始化列表
阅读量:7008 次
发布时间:2019-06-28

本文共 1942 字,大约阅读时间需要 6 分钟。

引言:这是C++对象内存分配的基础,为防止忘记。

看一个类包含其他类时是如何构造的。

#include 
using namespace std;class Object{public: Object() { cout << "Object.." << endl; } ~Object() { cout << "~Object.." << endl; }};class Container{public: Container() { cout << "Container...." << endl; } ~Container() { cout << "~Container..." << endl; }private: Object obj_;};int main(void){ Container c; return 0;}

 

Control+F5

命令行结果:

构造顺序 为包含关系 从内向外依次构造, 析构则相反。

 

变换一下构造函数,我们看看和初始化列表有没有关系。

1 #include 
2 using namespace std; 3 4 5 class Object 6 { 7 public: 8 Object(int num) : num_(num) 9 {10 cout << "Object.." << num_ << "..."<< endl;11 }12 ~Object()13 {14 cout << "Object.." << num_ << "..." << endl;15 }16 private:17 int num_;18 };19 20 21 22 class Container23 {24 public:25 Container(int num1=0, int num2=0) : obj1_(num1), obj2_(num2)26 {27 cout << "Container...." << endl;28 }29 ~Container()30 {31 cout << "~Container..." << endl;32 }33 private:34 Object obj1_;35 Object obj2_;36 };37 38 int main(void)39 {40 Container c(10, 20);41 return 0;42 }

 

打印结果:

 

我们将初始化列表调换一下顺序。

#include 
using namespace std;class Object{public: Object(int num) : num_(num) { cout << "Object.." << num_ << "..."<< endl; } ~Object() { cout << "Object.." << num_ << "..." << endl; }private: int num_;};class Container{public: Container(int num1 = 0, int num2 = 0) : obj2_(num2) ,obj1_(num1) //已经调换顺序 { cout << "Container...." << endl; } ~Container() { cout << "~Container..." << endl; }private: Object obj1_; Object obj2_;};int main(void){ Container c(10, 20); return 0;}

 

打印结果:

 

所以结论是:

构造顺序只与 成员对象定义的顺序有关,它们的内存从一开始就确定了,与初始化列表没有关系

只要obj1_定义在obj2_前面,构造顺序也一定是先构造obj1_;

转载于:https://www.cnblogs.com/DLzhang/p/4585824.html

你可能感兴趣的文章
LogParser v0.8.0 发布:一个用于定期增量式解析 Scrapy 爬虫日志的 Python 库
查看>>
MacOS安装git
查看>>
NEO改进协议提案6(NEP-6)
查看>>
iOS补位动画、沙漏效果、移动UITableViewCell、模拟贪吃蛇、拖拽进度等源码
查看>>
webapp字号大小跟随系统字号大小缩放
查看>>
[LeetCode] 430. Flatten a Multilevel Doubly Linked List
查看>>
常用布局
查看>>
交互式数据可视化-D3.js(四)形状生成器
查看>>
浅谈easy-mock 最好的备胎没有之一
查看>>
ES学习笔记(6)--数字操作
查看>>
数据上报分析一
查看>>
Vue.js 3.0 新特性预览
查看>>
什么是Jython?
查看>>
实现前后端分离的心得
查看>>
LeetCode 144 ——二叉树的前序遍历
查看>>
Windows上的Redis
查看>>
nginx系列2----从源码安装nginx和echo-nginx-module模块
查看>>
简洁易用的基于Promise的jsonp库easy-jsonp,了解下
查看>>
PHP-FPM设置max_chindren、max_requests
查看>>
[LintCode/LeetCode] Count Univalue Subtrees
查看>>