1.类里面的任何成员变量在定义时是不能初始化的。
2.一般的数据成员可以在构造函数中初始化。
3.const数据成员必须在构造函数的初始化列表中初始化。 because const
members may only be initialized, never assigned.因为const类型只能初始化而不能赋值。
4.static 要在类的定义外面初始化。
c++
Explicit Initialization(
显式初始化
)
的两种方法:
1.
type-name
name( initializer1, initializer2, ... initializern )
调用类构造函数(不一定是默认构造函数)
什么是默认构造函数?
“默认构造函数”是能够被
无参数调用
的构造函数。
在定义类时,如果没有定义构造函数,则当需要构造函数时,编译器将自动生成一个不带参数的构造函数,此构造函数成为默认构造函数。但如果用户为类定义了构造函数(不一定是默认构造函数,默认构造函数必须满足能够被无参数调用),则实例化类对象时将使用用户定义的构造函数,编译器不会生成构造函数。
定义类构造函数列表初始化的几种形式:
class B;
class A : public BaseClass
{
private:
int value1;
int value2;
B b;
};
1.
初始化为常量(const)
定义:A() : BaseClass(100,200),value1(50),value2(50),b(10,10){};
调用:A a; (无参数调用,是默认构造函数)
2. 参数赋初值
A(int i=1,n=2):value1(i),value2(n){};
调用:A a; (无参数调用,是默认构造函数)
A a(3,4);或
int x=7,y=8; A a(x,y);
3.
利用参数列表初始化(非常量)
A(int i,int n,int m,int k) : BaseClass(i,n),value1(m),value2(k),b(n,m){};
调用:A a(1,2,3,4);或
int x=2,y=1,z=7,w=8; A a(x,y,z,w);
调用A a;将出错,不是默认构造函数。
上面写成BaseClass(100,200),BaseClass(i,n),说明了类BaseClass构造函数的形式为带有两个参数。
2. type-name name = value
调用拷贝构造函数
拷贝构造函数定义形式:
class-name(class-name&);Can accept a single argument of reference to same class type
(注意不是name = value,这是赋值运算,不是初始化,它调用operator=)
默认拷贝构造函数和默认operator=带来的问题:
1。lose memory, the memory that
some pointer
point to was never deleted
2. will delete the memory still pointed to by other pointer.
the solution:Declare a copy constructor and an assignment operator for classes with dynamically allocated memory.
Explicitly disallow use of implicitly generated member functions you don't want.
operator=
in this case, private. By declaring a member function explicitly, you prevent compilers from generating their own version, and by making the function private, you keep people from calling it.