/**
* 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;
}
cppTest-6.0:類中特殊的成員的初始化
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.