C++对象的构造顺序
来源:互联网 发布:爷爷9岁被鬼子杀了知乎 编辑:程序博客网 时间:2024/06/02 05:32
在C++中对象的构造顺序有三种:
(1)局部构造对象顺序
(2)堆对象构造顺序
(3)全局对象构造顺序
(1)局部构造对象顺序构造对象例子:
当程序执行流到达对象的定义语句时进行构造
#include <stdio.h>class Test{private: int mi;public: Test(int i) { mi = i; printf("Test(int i): %d\n", mi); } Test(const Test& obj) { mi = obj.mi; printf("Test(const Test& obj): %d\n", mi); }};int main(){ int i = 0; Test a1 = i; //0 while( i < 3 ) { Test a2 = ++i; //1 2 3 } if( i < 4 ) { Test a = a1; //0 } else { Test a(100); } return 0;}
(2)堆对象构造顺序
当程序执行流到达new语句时创建对象
使用new创建对象将自动触发构造函数的调用
#include <stdio.h>class Test{private: int mi;public: Test(int i) { mi = i; printf("Test(int i): %d\n", mi); } Test(const Test& obj) { mi = obj.mi; printf("Test(const Test& obj): %d\n", mi); } int getMi() { return mi; }};int main(){ int i = 0; Test* a1 = new Test(i); //0 while( ++i < 10 ) if( i % 2 ) new Test(i); //1,3,5,7,9 if( i < 4 ) new Test(*a1); else new Test(100); //100 return 0;}
(3)全局对象构造顺序
对象的构造顺序是不确定的
不同的编译器使用不同的规则确定构造顺序
include “test.h”
Test t4("t4");int main(){ Test t5("t5");}
(4)使用goto改变顺序的危害
#include <stdio.h>class Test{private: int mi;public: Test(int i) { mi = i; printf("Test(int i): %d\n", mi); } Test(const Test& obj) { mi = obj.mi; printf("Test(const Test& obj): %d\n", mi); } int getMi() { return mi; }};int main(){ int i = 0; Test a1 = i; // Test(int i): 0 while( i < 3 ) { Test a2 = ++i; // Test(int i): 1, 2, 3 }goto End; Test a(100);End: printf("a.mi = %d\n", a.getMi()); return 0;}
下面是g++编译器执行的结果:
总结:
注:本文参考来自狄泰学院
0 0
- 对象构造的顺序
- 对象的构造顺序
- C++的对象构造顺序
- Java对象的构造顺序
- C++对象的构造顺序
- 21-对象的构造顺序
- java类构造对象的构造顺序
- C++——对象构造顺序
- [C++]多个对象构造、析构、构造和析构的顺序
- 含对象成员类的构造顺序
- 含对象成员类的构造顺序
- 含对象成员类的构造顺序
- 含对象成员类的构造顺序
- 对象构造顺序
- 【c++】构造函数调用顺序的研究
- C和C++的面向对象专题(7)——单例模式解决静态成员对象和全局对象的构造顺序难题
- c# 静态对象构造函数的执行顺序
- C++构造函数中成员对象的初始化顺序
- 面试笔试题目(参考)
- ANSYS中Beam188\Beam189单元命令流提取最大应力
- 如何判断Linux的tar.gz是二进制文件还是源码文件
- 状态模式
- oracle 排序是,如果为null, 降序则排在最前面,怎么让这些null值排在最后面。 Nulls last
- C++对象的构造顺序
- CentOS通过YUM升级centOS内核
- iFunk成为最受学生喜爱的笔记本之一
- 并行和并发区别
- grep 常用命令
- Tesseract Ocr 引擎识别图形验证码
- 支付宝的warning: (arm64)...: No such file or directory警告 和 #include <openssl/rsa.h> 'openssl/rsa.h' file
- 阿里云将80端口请求转发到其他端口
- RN常见错误之Element type is invalid