深入探索C++对象模型--C++构造函数
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了深入探索C++对象模型--C++构造函数,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1950字,纯文字阅读大概需要3分钟。
内容图文
C++构造函数语意
对象构造过程中编译器的干预原则和方法。
Default constructor的构建方法
经常会提到default constructor,那么什么时候才会合成出一个default consgtructor呢?当编译器需要它的时候。别合成出来的constructor值执行编译器所需的行动。
如果一个class没有任何constructor,但它内含一个成员对象,这个成员对象有default constructor,编译器需要为此class合成出一个defautl constructor,不过这个合成操作只有在constructor正在需要被调用时才会发生。
Class Foo {public: Foo(),Foo(int)};
Class Bar {public:Foo foo; char*str,}; //不是继承,是内含
Void foo_bar()
{
Barbar;// Bar::foo必须在此处初始化 Bar::foo是一个member object,而其class Foo拥有default constructor,符合条件
}
这么一来就说明,带有default constructor的member class object会造成含有此对象的类合成一个default constructor,也就是说,如果一个类中包含了类,但是被包含的类中有default constructor,那么这个类如果没有default constructor,编译器就会给它构造一个default constructor.
带有default constructor的base class
如果一个没有任何constructors的class派生自一个“带有defaultconstructor”的base class,那么这个derived class的default constructor会被视为有用的(nontrivial),并因此需要被合成出来。它将调用上一层base classes的default constructor
如果设计者提供了多个constructors,但其中都没有defaultconstructor?编译器不会再合成default constructor
同时需要注意,这里所说的default constructor都是那种没有任何参数的构造函数。
带有一个virtual function的class
带有一个virtual base class的class
上面讲述了四种情况下编译器会合成一个default constructor
所以,任何class如果没有定义default constructor就会被合成出一个来,这是不正确的。
编译器合成出来的default constructor会明确设定class内每一个data的默认值,这也是不正确的。
Copy constructor的构建操作:
这个时候这个函数会被调用呢?
Class X {};
X x;
X xx = x;// 直接被赋值
如果是 X xx;
Xx = x; //这个时候调用的是赋值操作
当一个对象作为另一个对象的初值时;当参数是传值调用时;当函数返回是传值调用时,这三种情况下都会用到copy constructor
在一般情况下,都是按位拷贝。但是在有些情况下,编译器会自动合成一个copy constructor,这些情况是什么呢?如果一个类包含了另一个类,另一个类中有copy construvtor,如果是virtual机制,如果有virtual base class.继承机制中,父类有了copy constructor
下面情况下,必须使用成员初始化列表来初始化对象:
当初始化一个引用成员时
当初始化一个constmember时
当调用一个baseclass的constructor,而它拥有一组参数时。
当调用一个member class的constructor,而它拥有一组参数时。
在这四种情况下,初始化都必须在成员初始化列表中完成。
Static成员变量一定要在类外定义,为什么呢?因为这个变量不属于任何一个对象,如果在构造函数中被调用,只要有对象被初始化时就会被调用,但是这个变量是不属于任何一个对象的。
综述:
这里总结了什么是default constructor 什么是copy constructor?同时在什么时候会被调用,社么时候编译器会合成这些函数。
原文:http://blog.csdn.net/yusiguyuan/article/details/41964991
内容总结
以上是互联网集市为您收集整理的深入探索C++对象模型--C++构造函数全部内容,希望文章能够帮你解决深入探索C++对象模型--C++构造函数所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。