cppTest-6.0:類中特殊的成員的初始化

/**
 * 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;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章