zoukankan      html  css  js  c++  java
  • C++中构造函数调用构造函数

    最近在整理C++知识的时候,突然想到如何在C++中实现构造函数调用构造函数的问题,常见的错误是按照如下方式来调用:

     1:  #include 
     3:  class Test
     4:  {
     5:  public:
     6:      int m_a;
     8:      Test(int a)
     9:      {
    10:          m_a = a;
    11:      }
    13:      Test()
    14:      {
    15:          Test(1);
    16:      }
    17:  };
    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)语句

  • 相关阅读:
    Java实现 蓝桥杯VIP 算法提高 快速幂
    Java实现 蓝桥杯VIP 算法提高 最长字符序列
    Java实现 蓝桥杯VIP 算法提高 最长字符序列
    Java实现 蓝桥杯VIP 算法提高 最长字符序列
    Java实现 蓝桥杯VIP 算法提高 最长字符序列
    Java实现 蓝桥杯VIP 算法提高 最长字符序列
    linux下配置QT(很全的步骤,从下载开始,配置QMAKESPEC)
    QT 读取文件夹下所有文件(超级简单的方法,不需要QDirIterator)
    Windows平台下的图形化的Ping工具
    Qt中的键盘事件,以及焦点的设置(比较详细)
  • 原文地址:https://www.cnblogs.com/lidan/p/2239488.html
Copyright © 2011-2022 走看看