关于默认构造函数的一点琢磨--全局变量和局部变量
来源:互联网 发布:朴槿惠犯了什么罪 知乎 编辑:程序博客网 时间:2024/05/01 09:22
首先看一个例子:
class A{public: //为了直接访问int i; };A a;int main(void){cout << a.i << endl;return 0;}这里的输出结果是0,因为a是一个全局变量,编译器在编译的时候会获得编译单元内的全局变量,然后生成两个函数:
_sti() 和_std(),执行对象的构造和析构。
本例中,没有定义类A的构造函数,但是编译器也不会为我们合成一个default constructor,原因见《深入探索C++对象模型》第二章,
class A{public:A() = default;int i;};A a;int main(void){cout << a.i << endl;return 0;}一样的结果。
class A{public:A(int j) { i = j; }int i;};A a;int main(void){cout << a.i << endl;return 0;}显示没有合适的默认构造函数。编译错误。
class A{public:A(int j) { i = j; }A() = default; //和 A() { } 效果一样int i;};A a;int main(void){cout << a.i << endl;return 0;}显示0.
再看一个变型:
class A{public:int i;};int main(void){A b;cout << b.i << endl;return 0;}此时, b是一个局部变量,编译的时候显示“使用了未初始化的局部变量“b” ”,编译错误。
即使要求编译器为我们合成一个default constructor:
class A{public:A() = default;int i;};int main(void){A b;cout << b.i << endl;return 0;}也无济于事,还是显示“使用了未初始化的局部变量“b” ”。
但如果此时定义了一个构造函数,而没有定义默认构造函数(因为已经有一个自己定义的构造函数了,编译器更不会为我们合成一个默认的):
class A{public:A(int j) { i = j; }int i;};int main(void){A b;cout << b.i << endl;return 0;}显示a没有合适的默认构造函数,
class A{public:A(int j) { i = j; }A() = default;int i;};int main(void){A b;cout << b.i << endl;return 0;}编译器给出的信息是b是未初始化的局部变量,
再看:
class A{public:A(int j) { i = j; }A() { }int i;};int main(void){A b;cout << b.i << endl;return 0;}
此时有了一个默认构造函数,显示:
自己定义了一个默认构造函数和要求编译器为我们合成的默认构造函数有什么不一样吗?
显然,即使编译器为我们合成了默认构造函数,也不会在函数体内为我们去初始化这些变量。
总结:
a是全局变量的时候:如果没有定义构造函数,则初始化为0;
定义了构造函数但不是默认的,显示没有默认构造函数可用;
两者都定义了,初始化为0。
b是局部变量的时候:如果没有定义构造函数,则显示定义了一个未初始化的局部变量;
定义了构造函数但不是默认的,显示没有默认构造函数可用;
两者都由自己定义,则显示的是垃圾值;
用户定义了一个非默认构造函数,编译器合成了一个默认构造函数,则显示定义了一个未初始化的局部变量。
说明:以上只是本人在看书的时候的一些想法,就去试验了一下,个中缘由还不能很好的把握,只能慢慢体会,希望能够理解的大神给小弟一些指点,不胜感激哪?
0 0
- 关于默认构造函数的一点琢磨--全局变量和局部变量
- 关于函数传参,全局变量,局部变量的一点认识
- 关于全局变量和局部变量
- 关于默认构造函数的一点总结
- static全局变量,局部变量,函数与普通全局变量,局部变量和函数的区别
- static全局变量,局部变量,函数与普通全局变量,局部变量和函数的区别
- static全局变量,局部变量,函数与普通全局变量,局部变量和函数的区别
- 关于在多线程中,局部变量和全局变量的使用。
- 关于JS里的全局变量和局部变量
- 关于全局变量和局部变量的一个小陷阱
- 关于C语言中的局部变量和全局变量的分析
- static修饰全局变量 局部变量和函数时候的区别
- static 修饰全局变量、局部变量和函数的区别
- python 函数的局部变量和全局变量 global
- 函数、全局变量、局部变量和动态内存的特点归纳
- python中有关函数的全局变量和局部变量
- 关于全局变量和局部变量说明
- javascript 关于局部变量和全局变量
- pyenv常用命令
- TransactionProxyFactoryBean spring事务代理的工程bean API讲解/翻译
- SpringMVC 集成velocity
- (1)Laravel的安装
- matlab imadjust 用 opencv改写
- 关于默认构造函数的一点琢磨--全局变量和局部变量
- 【高并发Java六】JDK并发包2
- python 斐波那契
- 异步获取数据Ajax,以及对获取的数据进行绑定(显示在页面上)
- android源码解析(1)--如何处理布局文件中添加的点击事件
- C#关闭子窗体更新父窗体(二)
- truncate 、delete与drop区别
- 抽象方法 接口 多重继承
- 69道有关Spring的问题和答案