c++结构体转为string_(转)结构体中使⽤string所引发的问题1.在程序中使⽤结构体。
#include
#includec++中string的用法
using namespace std;
struct list
{
string name;
double price;
float volume;
};
int main()
{
list number1={"mingzhe",88.0,1.76,};
list number2={"zhanghuanghui",66.1,1.65,};
cout<
cout<
return 0;
}
刚开始编译时20多个错,吓我⼀跳,后来发现,原来是初始化时,各个变量我⽤分号隔开了。实际上声明的时候是⽤分号隔开,初始化赋
值的时候就像数组⼀样⽤逗号分隔了。解决了这个问题后,发现还有两个错误。如下:
报错:error C2552: 'number1' : non-aggregates cannot be initialized with initializer list
MSDN中C2552说的是:
Compiler Error C2552
'identifier' : non-aggregates cannot be initialized with initializer list
The specified identifier was incorrectly initialized.
An initializer list is needed to initialize the following types:
An array
A class, structure, or union that does not have constructors, private or protected members, base classes, or virtual functions
These types are known as “aggregates.”
也 就是说标识符没有被正确初始化。结构中可以初始化的只能是数组或者⼀些没有构造函数、私有成员以及保护成员和基类、虚函数的
类、结构体、共⽤体。所以这⾥ 对string类对象name进⾏初始化就是⾮法了。VC++6.0中是这样的,
据说更⾼级的没有这个问题,我没
有试过。
所以程序中使⽤数组char name[20];代替string name;就可以了。但是有⼀个warning。
warning C4305: 'initializing' : truncation from 'const double' to 'float'
出在给float类型变量赋值的语句上。MSDN上说:
Compiler Warning (level 1) C4305
'identifier' : truncation from 'type1' to 'type2'
The specified identifier type was converted to a smaller type. Information was lost in the casting.
百 度了下原因。简单来说,Float为单精度,内存中占4个字节,有效数位是7位(因为有正负,所以不是8位),在我的电脑且VC++6.0平台中默认显⽰ 是6位有效数字;double为双精度,占8个字节,有效数位是16位,但在我的电脑且VC++6.0平台中默认显⽰同样是6位有效数字(见我的 double_float⽂件)
还有,有个例⼦:在C和C++中,如下赋值语句
float a=0.1;
编译器报错:warning C4305: 'initializing' : truncation from 'const double ' to 'float '
原因:
在C/C++中(也不知道是不是就在VC++中这样),上述语句等号右边0.1,我们以为它是个float,但是编译器却把它认为是个double(因为⼩数默认
double),所以要报这个warning,⼀般改成0.1f就没事了。
通常的做法,经常使⽤double,⽽不喜欢使⽤float。
突然想起来前⾯看过说:如果不指定类型,输⼊的⼩数默认为double类型。
2.结构可以将string类作为成员吗?
呃,刚发现下⾯马上讲这个问题。不过⾃⼰动⼿发现问题然后解决问题还是跟按部就班学习的感觉是不⼀样的。这⾥是这么解释的,取决于编译器,有些编译器不⽀持把string类对象作为成员的结构进⾏初始化。看来vc++6.0是不⽀持了。
3.C++使⽤户定义的类型和内置类型尽可能相似。
可以将结构作为参数传递给函数,函数也可以返回⼀个结构;可以使⽤赋值操作符“=”将结构赋值给另⼀个同类型的结构。
4. 结构数组的初始化。
使⽤⼀个被括在花括号中、⽤逗号分隔的值列表,其中每个值本⾝⼜是⼀个被括在花括号中、⽤逗号分隔的值的列表。List name[2]=
{ {“mingzhe”,0.5,21.2},{“huanghui”,0.4,21.1} };
5. 结构中的位字段。(还不是很明⽩)。
6. 共⽤体。
能够存储不同的数据类型,但是只能同时存储其中的⼀种类型。也就是说,结构可以同时存储int、long和double,但是公⽤体只能存储int、long或double。共⽤体的句法与结构相似,但是含义不同。⽐如:
#include
using namespace std;
union one4all
{
int int_val;
long long_val;
double double_val;
};
int main()
{
one4all pail;
pail.int_val=15;
cout<
pail.double_val=1.38;
cout<
return 0;
}
可 以使⽤one4all变量来存储int long或者double,条件是在不同的时间进⾏。由于共⽤体每次只能存储⼀个值,所以他必须有⾜够的空间来存 储最⼤的成员。所以共⽤体的长度为其最⼤成员的长度。共⽤体的⽤途之⼀就是,当数据项使⽤两种或更多种格式(但不会同时使⽤)时,可以节省空间。
7. 枚举。
Enum提供了另⼀种创建符号常量的⽅式,这种⽅法可以代替const。⽐如:
Enum spectrum{red,orange,yellow,green,blue,white};将red等作为符号常量,他们对应整数值0-7,这些常量叫枚举量。
8. 在C++创建指针时,计算机将分配⽤来存储地址的内存,但是不会分配⽤来存储指针所指向的数据的内存。为数据提供空间是⼀个独⽴的步骤,忽略这⼀步⽆疑是⾃⿇烦。
⼀定要在对指针应⽤接触引⽤操作符*之前,将指针初始化为⼀个确定的适当的地址。这是使⽤指针的⾦科⽟律。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论