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

    http://www.cnblogs.com/lidan/archive/2011/08/10/2239488.html
    如果你要构造一个自定义类的对象时,可以使用“类型构造操作符”。这将导致编译器为你调用构造函数。

    比如你写了一个类,叫BaseItem.显然你可以这样定义一个BaseItem对象:
    BaseItem aItem; // 调用默认构造函数
    你还可以这样定义一个BaseItem对象:
    BaseItem aItem = BaseItem(); // 调用默认构造函数。这里"()"表示“类型构造操作符”,
    // 用来实例化一个对象
    假如你的构造函数接受一个string对象作为参数,你还可以这样定义BaseItem:
    BaseItem aItem("This is a base item"); // 这会使编译器为你调用相应的构造函数。

    ok,上面的都明白了嘛?下面再开始讲类的构造函数和成员函数有什么区别。
    (非静态)成员函数是通过对象/指向对象的指针/指向对象的引用来调用的。你只能通过这3种方式来调用一个成员函数。那么很显然,实质上无论如何要调用成员函数都必须通过对象。
    比如BaseItem里面有一个成员函数叫memfunc,那么你可以这样调用它:
    aItem.memfunc(...parameters...);

    而构造函数却是用来构造对象的。在对象还没形成之前,你怎么能够通过对象去调用函数?所以...你无法通过对象去调用构造函数
     1:  #include 
     3:  classTest
     4:  {
     5:  public:
     6:  intm_a;
     8:  Test(inta)
     9:  {
    10:  m_a=a;
    11:  }
    13:  Test()
    14:  {
    15:  Test(1);
    16:  }
    17:  };
    19:  intmain(intargc,char*argv[])
    20:  {
    21:  Testvar;
    22:  std::cout<<var.m_a<<std::endl;
    23:  return0;
    24:  }

    这段代码输出的是一个不确定的值,m_a的值并不是1,原因在于执行Test(1)时,并不是用这一构造函数来初始化当前的内存区,而是初始化了一个临时对象的内存区。

    那么如何在C++中实现构造函数调用构造函数呢?
    这里需要说明一下new的另一种new的表达式----定位new表达式(placement new),它的作用是在已分配的原始内存中初始化一个对象,它与new的其他版本不同之处在于它并不分配内存。
    STL中的原型如下:

    1:  void*operatornew(size_t,conststd::nothrow_t&)throw();
    2:  void*operatornew(size_t,void*)throw();
    3:  void*operatornew[](size_t,conststd::nothrow_t&)throw();
    4:  void*operatornew[](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:  publicclassBase
     2:  {
     3:  int_a;
     4:  int_b;
     5:  
     6:  publicBase()
     7:  {
     8:  _b=2;
     9:  }
    10:  
    11:  publicBase(inta):this()
    12:  {
    13:  _a=a;
    14:  }
    15:  }

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

    
    

    C++中构造函数调用构造函数

  • 相关阅读:
    XPOSED优秀模块列表 反射
    XPOSED优秀模块列表 ENABLE CALL RECORDING (三星启用通话录音)
    sp_Rename批量修改数据表的列名
    我的第一个sql server function
    js传递参数时是按照值传递的
    TreeView 绑定到深度未知的数据源
    silverlight中WCF服务定义终结点后可以方便部署
    Jquery常用方法合集,超实用
    sql 触发器 if条件判断
    如何用js判断document里的一个对象是否存在?或是是否有效
  • 原文地址:https://www.cnblogs.com/zhangyongjian/p/3657478.html
Copyright © 2011-2022 走看看