一、基本数据类型(C++内置数据类型,包括int、float、char、bool)
1.一般成员变量,在构造函数的成员初始化列表或函数体中进行初始化。
(注:初始化列表的初始化变量顺序是根据成员变量的声明顺序来执行的)
className {
public:
className(int nId)/*: id(nId)*/ {
id = nId; // preferred
}
private:
int id;
};
2.静态成员变量,在类体外初始化,且不能位于任何函数中。
className {
private:
static int total;
};
int className::total = 0; // 不用static关键字修饰
3.成员常量和引用成员,只能在构造函数的成员初始化列表中进行初始化。因为一旦进入构造函数,此两类数据均不能再改变。
view plaincopy to clipboardprint?
className {
className(int nId, int &toRef): id(nId), ref(toRef) {
// 不能在函数体中对常量数据成员和引用成员进行初始化
}
private:
const int id;
int &ref;
};
4.静态成员常量,可以像静态成员变量一样,在类体外进行初始化。若为整型(包括int、bool、char),还可以在声明的位置进行初始化。view plaincopy to clipboardprint?
className {
private:
static const int SubjectCount = 3; // preferred.只有整型静态成员常量才能在声明的位置进行初始化
static const double d;
};
const double className::d = 1e-10; // 只能如此初始化
// const int className::SubjectCount = 3; 也可以
二、自定义数据类型(包括标准库中包含的string等类型)
1.一般成员变量,只能在构造函数的成员初始化列表中进行初始化(实例化该类对象)。
view plaincopy to clipboardprint?
class myType {
public:
myType(char ch) {
c = ch;
}
private:
char c;
};
class T {
public:
T(char ch): mtp(ch) { // 调用myType类的构造函数,实例化该类对象
}
private:
myType mtp;
};
若自定义数据类型存在缺省构造函数或没有定义构造函数而使用编译器提供的默认构造函数,则可以省略对该类型的构造函数的调用,编译器会自动调用缺省/默认构造函数,完成该类对象的构造,如标准库中的string类型。
2.静态成员变量和静态成员常量,在类体外进行初始化,且不能位于任何函数中。
view plaincopy to clipboardprint?
class T {
public:
static const string str;
};
const string T::str("abcdef"); // 不用static修饰.const string T::str = "abcdef";与之等价,因为string类的构造函数未用explicit修饰,编译器进行隐式转换
//const string T::str;等价于 const string T::str("");
3.成员常量和引用成员,只能在构造函数的成员初始化列表中进行初始化。因为一旦进入构造函数,此两类数据均不能再改变。
view plaincopy to clipboardprint?
class myType {
public:
myType(char ch) {
c = ch;
}
private:
char c;
};
class T {
public:
T(myType obj, myType &toRef): mtp(obj), ref(toRef) { // 只能在初始化列表中对成员常量和引用成员进行初始化
}
public:
const myType mtp;
myType &ref;
};
三、总结
1.所有的静态数据成员(包括常量和变量)均可在类体外进行初始化;所有的非静态数据成员(包括常量和变量)均可在构造函数初始化列表中进行初始化。
2.整型静态成员常量还可以在声明的位置处进行初始化。
3.属于基本数据类型的非静态成员变量还可以在构造函数体中进行初始化。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/oyquan/archive/2009/09/22/4581110.aspx