[C++] Class (part 2)

Members that are const or reference must be initialized. Similary, members that are of a class type that does not define a default constructor also must be initialized.

class ConstRef{
public:
    ConstRef(int ii);
private:
    int i;
    const int ci;
    int & ri;
};

ConstRef::ConstRef(int ii){
    i = ii;    // ok
    ci = ii;    // error: cannot assign to a const
    ri = i;     // error: ri was never initialized
}

By the time the constructor begin executing, initialization is completed. The correct way to wirtie this constructor is:

// explictly initialize reference and const members
ConstRef::ConstRef(int ii): i(ii), ci(ii), ri(i) { }

Members are initiazlied in the order in which they appear in the class definition, not the order in which they appear in the constructor initializer.

class X{
    int i;
    int j;
public:
    // undefined: i is initialized before j
    X(int val): j(val), i(j) { }
}

To avoid using members to initiazlie other members.

    X(int val): j(val), i(val) { }
class Sales_data{
public:
    // non-delegating constructor initialize member before corresponding argument
    Sales_data(string s, unsigned cnt, double price): bookNo(s), units_sold(cnt), revenue(cnt * price) { }

    // remaining constructors all delegate to another constructor
    Sales_data(): Sales_data('', 0, 0) { }
    Sales_data(string s): Sales_data(s, 0, 0){ }
    Sales_data(istream & is): Sales_data() { read(is, *this); }
};

Had the function bodies contain code, that code would be run before control return to the function body of the delegating constructor.

In practice, it is almost right to provide a default constructor if other constructor is defined.

class NoDefault{
public:
    NoDefault( const string &);
    // additional members follow, but no other constructor
};

Struct A{
    NoDefault my_mem;
};

A a;    // error: cannot synthesize a constructor of A

Struct B{
    B() { }    // error: no initialization for b_member
    Default b_member;
};

It is common mistake among programmers new to C++ to try to declare  an object initialized with the default constructor as function

    // opps! defines a function taking no parameter and returning an object of type Sales_data
    Sales_data obj();

    // define an object that use the default constructor
    Sales_data obj;

Reference:

C++ Primer, Fifth Edition, chapter 7 Classes

原文地址:https://www.cnblogs.com/TonyYPZhang/p/6551603.html