[C++] Call an overloading constructor within a constructor (C++上构造函数里调用重载构造函数)
来源:互联网 发布:广州淘宝实景摄影棚 编辑:程序博客网 时间:2024/06/05 03:36
来自: http://hi.baidu.com/quark282/blog/item/a71151a04e56ede69052ee83.html
2010-12-20 18:18
最近在整理C++知识的时候,突然想到如何在C++中实现构造函数调用构造函数的问题,常见的错误是按照如下方式来调用:
1: #include
2:
3: class Test
4: {
5: public:
6: int m_a;
7:
8: Test(int a)
9: {
10: m_a = a;
11: }
12:
13: Test()
14: {
15: Test(1);
16: }
17: };
18:
19: int main(int argc,char* argv[])
20: {
21: Test var;
22: std::cout<<var.m_a<<std::endl;
23: return 0;
24: }
这段代码输出的是一个不确定的值,m_a的值并不是1,原因在于执行Test(1)时,并不是用这一构造函数来初始化当前的内存区,而是初始化了一个临时对象的内存区。
2:
3: class Test
4: {
5: public:
6: int m_a;
7:
8: Test(int a)
9: {
10: m_a = a;
11: }
12:
13: Test()
14: {
15: Test(1);
16: }
17: };
18:
19: int main(int argc,char* argv[])
20: {
21: Test var;
22: std::cout<<var.m_a<<std::endl;
23: return 0;
24: }
这段代码输出的是一个不确定的值,m_a的值并不是1,原因在于执行Test(1)时,并不是用这一构造函数来初始化当前的内存区,而是初始化了一个临时对象的内存区。
那么如何在C++中实现构造函数调用构造函数呢?
这里需要说明一下new的另一种new的表达式----定位new表达式(placement new),它的作用是在已分配的原始内存中初始化一个对象,它与new的其他版本不同之处在于它并不分配内存。
STL中的原型如下:
这里需要说明一下new的另一种new的表达式----定位new表达式(placement new),它的作用是在已分配的原始内存中初始化一个对象,它与new的其他版本不同之处在于它并不分配内存。
STL中的原型如下:
1: void * operator new (size_t, const std::nothrow_t &) throw();
2: void * operator new (size_t, void *) throw();
3: void * operator new[] (size_t, const std::nothrow_t &) throw();
4: void * operator new[] (size_t, void *) throw();该表达式的形式如下:
2: void * operator new (size_t, void *) throw();
3: void * operator new[] (size_t, const std::nothrow_t &) throw();
4: void * operator new[] (size_t, void *) throw();该表达式的形式如下:
1: new (place_address) type2: new (place_address) type (initializer-list)其中place_address必须是一个指针,而intializer-list提供了(可能为空的)初始化立 标,以便在构造新分配的对象时使用。
对于上面的例子,我们可以使用定位new表达式来完成构造函数之间的调用:
1: Test()
2: {
3: new (this) Test(1);
4: }最后,对于构造函数相互调用的问题,可以考虑一下两点建议:
1)可以考虑使用构造函数的默认参数来减少这种调用方式。
2)如果仅仅为了一个构造函数重用另一个构造函数的代码,那么完全可以把构造函数中的公共部分抽取出来定义一个成员函数(推荐为private),然后在每个需要这个代码的构造函数中调用该函数即可。
2: {
3: new (this) Test(1);
4: }最后,对于构造函数相互调用的问题,可以考虑一下两点建议:
1)可以考虑使用构造函数的默认参数来减少这种调用方式。
2)如果仅仅为了一个构造函数重用另一个构造函数的代码,那么完全可以把构造函数中的公共部分抽取出来定义一个成员函数(推荐为private),然后在每个需要这个代码的构造函数中调用该函数即可。
附:C#中构造函数相互调用的例子
1: public class Base 2: {
3: int _a;
4: int _b;
5:
6: public Base()
7: {
8: _b = 2;
9: }
10:
11: public Base(int a) :this()
12: {
13: _a = a;1
4: }
15: }
简单一点说就是this(params)语句
- [C++] Call an overloading constructor within a constructor (C++上构造函数里调用重载构造函数)
- OOP 5. Constructor Overloading(构造函数重载) - TimeOfDay
- 小结:c#Constructor构造函数注入
- [C++]default constructor默认构造函数
- 构造函数(constructor)
- 构造函数CONSTRUCTOR
- 构造函数constructor
- c++: 构造函数(constructor)与各种眼花缭乱的初始化(initialization)
- 复制构造函数(copy constructor)
- default constructor(默认构造函数)
- default constructor 的构造函数
- Copy constructor拷贝构造函数
- explicit constructor(显示构造函数)
- 拷贝构造函数 (Copy constructor)
- initCompent()和构造函数(constructor)
- 构造函数语义学---default constructor
- 构造函数语义学----copy constructor
- 对象模型 ------- Constructor 构造函数
- 小小换行符乱谈(文本文件vs二进制文件) .
- Variable Mangling in Bash with String Operators
- 链接update
- floodfill种子染色算法+实例运用
- window.event.keycode值大全
- [C++] Call an overloading constructor within a constructor (C++上构造函数里调用重载构造函数)
- 协作图(Collaboration Diagram)—UML图(七)
- zoj 1508 Intervals
- Android学习笔记(一)
- 电磁场与公共卫生(转载自WHO网站)
- 浅谈:Android顶层源代码结构
- iPhone公用代码库开源代码网址(cc_team贡献,陈曦,陈旭)
- 感悟(总结)
- 三木用希拉里的内裤做新闻营销