22-其他结构属性
4.4.4 其他结构属性
C++使用户定义的类型与内置类型尽可能相似。例如,可以将结构作为参数传递给函数,也可以让函数返回一个结构。另外,还可以使用赋值运算符(=)将结构赋给另一个同类型的结构,这样结构中每个成员都将被设置为另一个结构中相应成员的值,即使成员是数组。这种赋值被称为成员赋值(memberwise assignment),将在第7章讨论函数时再介绍如何传递和返回结构。下面简要地介绍一下结构赋值,程序清单4.12是一个这样的示例。
程序清单4.12 assgn_st.cpp
// assgn_st.cpp -- assigning structures
#include <iostream>
struct inflatable
{
char name[20];
float volume;
double price;
};
int main()
{
using namespace std;
inflatable bouquet =
{
"sunflowers",
0.20,
12.49
};
inflatable choice;
cout << "bouquet: " << bouquet.name << " for $";
cout << bouquet.price << endl;
choice = bouquet; // assign one structure to another
cout << "choice: " << choice.name << " for $";
cout << choice.price << endl;
return 0;
}
下面是该程序的输出:
bouquet: sunflowers for $12.49
choice: sunflowers for $12.49
从中可以看出,成员赋值是有效的,因为choice结构的成员值与bouquet结构中存储的值相同。
可以同时完成定义结构和创建结构变量的工作。为此,只需将变量名放在结束括号的后面即可:
struct perks
{
int key_number;
char car[12];
} mr_smith, ms_jones; // two perks variables
甚至可以初始化以这种方式创建的变量:
struct perks
{
int key_number;
char car[12];
} mr_glitz =
{
7, // value for mr_glitz.key_number member
"Packard" // value for mr_glitz.car member
};
然而,将结构定义和变量声明分开,可以使程序更易于阅读和理解。
还可以声明没有名称的结构类型,方法是省略名称,同时定义一种结构类型和一个这种类型的变量:
struct // no tag
{
int x; // 2 members
int y;
} position; // a structure variable
这样将创建一个名为position的结构变量。可以使用成员运算符来访问它的成员(如position.x),但这种类型没有名称,因此以后无法创建这种类型的变量。本书将不使用这种形式的结构。
除了C++程序可以使用结构标记作为类型名称外,C结构具有到目前为止讨论的C++结构的所有特性(C++11特性除外),但C++结构的特性更多。例如,与C结构不同,C++结构除了成员变量之外,还可以有成员函数。但这些高级特性通常被用于类中,而不是结构中,因此将在讨论类的时候(从第10章开始)介绍它们。