//程序很简单,相信大家都会,也会比好写的好。我写的很烂.........................
//不过有几个地方相信初学者,刚开始学习跟我一样有点迷糊。
#include<iostream>
using namespace std;
const int SIZE=15;
class point
{
private:
const int size; //这里在类的私有数据中定义了常量
char *pf;
int d;
long zs,suz;
long double xs,sus;
static long h; //这里定义了静态数据
static long double r;
bool fund() //查找小数点并查看字符串是否包含非法字符
{
for(int i=0;i<size;i++)
{
if(pf[i]<='9'&&pf[i]>='0'||pf[i]=='.')
{
if(pf[i]=='.') d=i;
else if(i==size-1) return true;
}
else return false;
}
}
void funz() //把小数点前的转换成数字并相加
{
for(int i=d-1;i>=0;i--)
{
zs=(pf[i]-'0')*h;
suz+=zs;
h*=10;
}
}
void funx()// 把小数点后的部分转换并相加
{
for(int i=d+1;i<size;i++)
{
xs=(pf[i]-'0')*r;
sus+=xs;
r*=0.1;
}
}
long double funh() //判断是否有异常,并返回计算结果
{
cout.setf(ios_base::fixed,ios_base::floatfield); //采用定点输出,也就是不让c++在double值到百万位是自动转换成e格式。
cout.precision(4); //保留4位小数
if(fund())
{
if(d==0)
{
d=size;
funz();
}
else
{
funz();
funx();
}
return suz+sus;
}
else
{
cout<<"有非法字符";exit(1);
}
}
public:
point(char *pt=0):pf(new char[strlen(pt)+1]),size(strlen(pt)) //这里采用了成员初始化列表的句法
{
d=0;
zs=suz=0;
xs=sus=0.0;
strcpy(pf,pt);
}
friend ostream& operator<<(ostream& os, point& shzi)
{
os<<shzi.funh();
return os;
}
~point() { delete[]pf; }
};
long point::h=1; //这里初始化了静态成员变量 ,
long double point::r=0.1;
int main()
{
char str[SIZE];
cin.get(str,SIZE-1);
str[SIZE-1]=0;
while(cin.get()!='/n')continue;
cin.clear();
point wyz(str);
cout<<wyz;
return 0;
}
不能在类声名中初始化静态成员变量,这是因为声名描述了如何分配内存,但并不分配内存。但可以使用这种格式来创建对象,从而分配和初始化内存。
对于静态成员可以在类声名之外使用单独语句初始化,这是因为静态类成员是单独存储的,而不是对象的组成部分。请注意,初始化语句指出类型,并使用了作用域操作符。
对于不能在类声名中初始化静态数据成员的一种例外情况是,静态数据成员为整型或枚举型const。
.................
成员初始化列表的句法只能用于构造函数。
必须用这种格式初始化非静态const数据成员。
必须用这种格式初始化引用数据成员。