C++构造函数调用构造函数问题

摘要:本文介绍了在C++中实现构造函数调用构造函数的实现方法。
关键字:C++     构造函数    定位new      placement new

最近在整理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)时,并不是用这一构造函数来初始化当前的内存区,而是初始化了一个临时对象的内存区。

那么如何在C++中实现构造函数调用构造函数呢?
这里需要说明一下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();

该表达式的形式如下:

1:  new (place_address) type
2:  new (place_address) type (initializer-list)

其中place_address必须是一个指针,而intializer-list提供了(可能为空的)初始化立标,以便在构造新分配的对象时使用。

对于上面的例子,我们可以使用定位new表达式来完成构造函数之间的调用:

1:  Test()
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;
14:      }
15:  }

简单一点说就是this(params)语句

参考文献:
http://en.wikipedia.org/wiki/Placement_syntax
http://blog.csdn.net/leatinfy/archive/2008/03/17/2192409.aspx
C++ Primer

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值