结构
结构可存放不同资料型态的数值,例如
#include <iostream>
struct Demo {
int member1;
char *member2;
float member3;
};
int main() {
Demo d;
d.member1 = 19823;
d.member2 = "203";
d.member3 = 3.011;
std::cout << "member1: " << d.member1 << std::endl;
std::cout << "member2: " << d.member2 << std::endl;
std::cout << "member3: " << d.member3 << std::endl;
return 0;
}
第3 行定义一个结构,使用关键字 struct,其后为结构的识别字名称,后面的大括弧宣告结构的成员(member) 。此例的Demo有3 个成员,分别属于int、char *与float
struct Demo {
int member1;
char *member2;
float member3;
};
设定或存取结构的成员可利用小数点运算子 .,此例编译执行结果如下
$ g++ u0705_1.cpp
$./a.out 复制代码
会员1:19823
成员2:203
会员3:3.011
$
若结构的成员为指标,就得利用->运算子存取。
结构其实是预设为public的类别(class) ,因此可加入成员函数(member function) ,例如我们替Demo增加一个member4()
#include <iostream>
struct Demo {
int member1;
float member2;
char *member3;
void member4();
};
void Demo::member4() {
std::cout << "Do something!" << std::endl;
}
int main() {
Demo d;
d.member4();
return 0;
}
呼叫成员函数同样用小数点运算子,编译执行结果如下
$ g++ u0705_2.cpp
$./a.out 复制代码
做一点事!
$
联合
联合可存放不同资料型态的数值,但是只能有一个成员(member) 被赋值,例如
#include <iostream>
union Demo {
int member1;
float member2;
char *member3;
};
int main() {
Demo d;
d.member1 = 1;
d.member2 = 2.0;
d.member3 = "3";
std::cout << "member1: " << d.member1 << std::endl;
std::cout << "member2: " << d.member2 << std::endl;
std::cout << "member3: " << d.member3 << std::endl;
return 0;
}
第3 行定义一个联合,使用关键字 union,其后为联合的识别字(identifier) 名称,后面的大括弧宣告联合的成员。此例的Demo有3 个成员,分别属于int、float与char 指标
#include <iostream>
union Demo {
int member1;
float member2;
char *member3;
};
设定或存取联合的成员可利用小数点运算子 .,此例编译执行结果如下
$ g++ u0706.cpp
$./a.out 复制代码
会员1:124833572
成员2:1.81165e-34
成员3:3
$
我们可以看到只有member3的值是正常的,其他member1与member2由于变成未定义的值,因此印出来的是记忆体位址的残值。
联合其实是一种节省空间的类别(class) ,也可以嵌入类别中当巢状联合(nested union) 或匿名联合(anonymous union) 。