当前位置: 首页 > 工具软件 > CppTest > 使用案例 >

cppTest-6.0:类中特殊的成员的初始化

公西国发
2023-12-01
/**
 * 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;
}

 类似资料: