首页 > 代码库 > Primer随笔

Primer随笔

Day1 

   如果成员是const 、引用,或者属于某种未提供默认构造函数的类类型,我们必须通过构造函数初始化值列表为这些成员提供初始值。

  例如:

    class ConstRef{

    public:

        ConstRef(int ii);

    private:

        int i;

        const int ci;

        int &ri;

    }

    ConstRef::ConstRef(int ii){

      i = ii;

      ci = ii;  ( 错误 不能赋值)

      ri = ii;  (ri没有被初始化)

    }

    ConstRef::ConstRef(int ii):i(ii),ci(ii),ri(ii){}(正确)

    这里也体现了数据成员的初始化和赋值之间的差异

    编译器创建的构造函数又称为合成构造函数

    初始化的顺序没有什么要求,但是如果一个成员使用另一个成员来初始化的话,就要考虑初始化的顺序了。

    但是尝试primer习题中的这个例子 发现编译过程并没有报错,按照书上的说法是先构造a 会有问题。 环境Vs2010   

    struct X {
    X(int i , int j):b(j),a(b%i){}
    int a,b;
    };

    C11新增委托构造函数

    

    构造函数,在实例化的过程中会调用,所以有些情况下,没有默认构造函数,编译还是可以过的。

    只允许一步类类型转换

    例如 a接受string类型的参数构造 那么b=a("tempconstructor") 错误 string c = "tmpconstructor" b=a(c) 正确

    可以用explicit抑制构造函数定义的隐式转换(explicit只能出现在类内声明处) 只能直接初始化 不接受拷贝形式初始化

    a{

      explicit a(string b){}

     }

     那这时上述构造方式都会有问题

Primer随笔