zoukankan      html  css  js  c++  java
  • 构造函数constructor 与析构函数destructor(三)

    (1)构造函数初始化列表:

    1 class Test{
    2     int i;
    3 public:
    4     Test(int vi):i(vi){}//这里的从冒号开始,到右大括号结束,这一段是构造函数初始化列表
    5 
    6 };

    构造函数的执行分为两个阶段:(1)初始化阶段  (2)普通计算阶段

    初始化是我们定义一个变量,分配内存时直接给变量赋值,例如 int i=10;  而int k; k=10;这样的就不是初始化,是赋值。所以在初始化列表里面的初始化才是真正的初始化,即初始化阶段。而在构造函数内的那些是赋值操作,即普通计算阶段。

    (1)const 成员变量的初始化,只能在构造函数初始化列表初始化,其实在其定义处也可以直接初始化

    1 class Object{
    2     const int i;//const成员变量
    3 public:
    4     Object(int vi):i(vi){}//在初始化列表中对const成员变量初始化
    5 
    6 };

    (2)引用成员变量的初始化,也只能在构造函数初始化列表中进行

    1 class Object{
    2       int N;
    3       int& refN;//引用成员变量
    4 public:
    5      Object():refN(N){}//在构造函数初始化列表处对引用成员变量初始化
    6 
    7 
    8 };

    (3)对象成员的初始化,如果子对象没有默认构造函数,也只能放在外部类的构造函数初始化列表初始化。

     1 class Object{
     2     int m_i;
     3 public:
     4     Object(int vi):m_i(vi){}
     5 
     6 };
     7 
     8 class Container{
     9     Object obj;
    10 public:
    11      Container(){}
    12 };
    13 
    14 
    15 int main(){
    16  
    17     Container cn;//这句话会报错误,因为在创建Container对象时,会先创建Object的对象,此时会调用Object的默认构造函数 ,但是我们在Object类里面并没有定义默认构造函数。 
    18     return 0;
    19 }

    所以上面的问题有两个解决版本,一是在Object类中添加默认构造函数,二是在Container构造函数初始化列表中,像obj(0)这样初始化obj对象。

    如果一个类中包含对象成员,那么再构造时,先构造对象成员,然后再构造外部对象。 并且一个类中包含多个对象成员,这些对象成员的构造顺序是和定义顺序一致的。在析构对象成员时,和定义的顺序相反。

    还有就是先析构外部对象,再析构内部子对象。

    (4)如果要定义一个对所有对象都是常量的成员,可以采用两种形式 一,是const static int   二,是enum枚举

     1 class Object{
     2     const static int N=10;
     3     enum E_Type{
     4           TYPE_A=100; 
     5      };
     6      int a[N];
     7      int b[TYPE_A];
     8 public:
     9 
    10 
    11 };
  • 相关阅读:
    实现新layer的时候易犯的错误
    caffe实现focal loss层的一些理解和对实现一个layer层易犯错的地方的总结
    面经准备
    发送广播
    labelme也可以标注polygan
    中期答辩准备的东西
    授人以鱼,不如授人以渔
    python中strip()函数的理解
    栈的应用
    checkStyle使用具体解释
  • 原文地址:https://www.cnblogs.com/cplinux/p/5616612.html
Copyright © 2011-2022 走看看