/**
* cppTest-6.0:类中特殊的成员的初始化
*
*有些成员变量的数据类型比较特别,它们的初始化方式也和普通数据类型的成员变量有所不同。这些特殊的类型的成员变量包括:
*@@一般变量:可以在构造函数中或成员函数中初始化,也可以通过参数列表进行初始化。
*@@一般常量:必须通过参数列表进行初始化。
*@@引用变量:必须通过参数列表进行初始化。
*@@静态变量:只能在类外初始化且不能再带有static关键字。
*@@静态常量(整型):在类中定义时初始化;若没有初始化,就只能在类外初始化;如果已经在类里初始化,那在类外不能再赋值!
*@@静态常量(非整型):在C-Free5中测试结果——同上!网上有人说只有静态常量整型数据成员才可以在类中初始化......
*@@对象成员:必须通过参数列表进行初始化。
*
*关于静态常量初始化问题C++ Primer的权威说明:只有有序类型(char,shrot,int,long)才可以在类里初始化!
*上面的double型也可以初始化可能是编译器升级的缘故吧?
* author 炜sama
*/
#include<iostream.h>
class string{
private:
char *str;
public:
string(char *s){
str=new char[strlen(s)+1];
strcpy(str,s);
}
string(string &a)
{
str=new char[strlen(a.str)+1];
strcpy(str,a.str);
}
~string(){ delete str; }
void show(){ cout<<str<<endl; }
};
class InitTest{
private:
int i0;
//int i1=0;//错误!
const int ci0;
//const int ci1=0;//错误!
static int si0;
//static int si1=0;//错误!
//有序类型(char,shrot,int,long)静态常量才能初始化!!!
static const char scc='c';
static const short scs=0;
static const long scl=0;
static const int sci0;//一般情况下没错,但是如果这个常量被访问到的话就会出错:没有初始化!
//定义时没有初始化的话就只能在类外初始化了!
static const int sci1=0;//注意:在vc6下测试错误!在C-Free5中测试通过!网上、书上都说这是正确的!
const static int csi = 100;//正确!与上面的等价!
//非有序类型静态常量按c++ primer的说法应该是不能初始化的,但是在c-free里却可以!
static const float scf=1.0f;
static const long double scld=1.0;
static const double csd0;
static const double csd1 = 99.9;//正确!在C-Free5中测试通过!
//数组也不是有序类型,不能初始化,在c-free里也不能初始化!
//static const int scia[5]={0,1,2,3,4};
int &ri0;
//int &ri1=i0;//错误!引用定义时不能初始化!必须通过参数列表进行初始化。
//int &ri2;//ri2没有初始化,运行时错误!!
string s;//对象成员
public:
InitTest():i0(0),ci0(0),ri0(i0),s("呵呵呵呵呵"){};//通过参数列表进行初始化
~InitTest(){};
//与Java一样,非静态函数可以访问静态成员!
void print(){
cout<<"print----------------------------"<<endl;
cout<<"i0:"<<i0<<endl;
cout<<"ci0:"<<ci0<<endl;
cout<<"si0:"<<si0<<endl;
cout<<"sci0:"<<sci0<<endl;
cout<<"sci1:"<<sci1<<",csi:"<<csi<<endl;
cout<<"csd0:"<<csd0<<",csd1:"<<csd1<<endl;
cout<<"ri0:"<<ri0<<endl;
s.show();
}
//与Java一样,//静态方法只能访问静态成员!!
static void printStatic(){
cout<<"printStatic----------------------"<<endl;
//cout<<"i0:"<<i0<<endl;
//cout<<"ci0:"<<ci0<<endl;
cout<<"si0:"<<si0<<endl;
//cout<<"sci0:"<<sci0<<endl;
cout<<"sci1:"<<sci1<<",csi:"<<csi<<endl;
cout<<"......"<<endl;
}
};
//int InitTest::i0=0;//错误!非静态变量不能能这样初始化!
//int InitTest::ci0=0;//错误!非静态常量不能这样初始化!
int InitTest::si0=0;//正确!静态变量可以这样初始化!
const int InitTest::sci0=0;//正确!静态常量定义时没有初始化的话就只能在类外初始化了!
//const int InitTest::sci1=0;//错误!已经初始化不能再赋值!
const double InitTest::csd0=0.0;//正确!静态常量定义时没有初始化的话就只能在类外初始化了!
//const double InitTest::csd1=0.0;//错误!已经初始化不能再赋值!
int main()
{
InitTest sm;
sm.print();
sm.printStatic();
return 0;
}