c++教程(十五:Data structures)

来源:互联网 发布:vb中cls含义 编辑:程序博客网 时间:2024/05/08 10:05

————————————————————————

该系列教程为翻译c++官方教程,点击参考英文原版,水平有限,翻译不通之处敬请谅解!

————————————————————————

数据结构体

数据结构是在一个名称下的一组数据元素集合。这些数据元素,被称为成员,可以有不同的类型和长度。数据结构可以用下面的语法在C++声明:

struct type_name {member_type1 member_name1;member_type2 member_name2;member_type3 member_name3;} object_names;

这里type_name是结构体类型的名字,
在type_name是结构型的名字,object_name可以是这种结构类型的对象有效的标识符。在大括号中,有一个数据成员的列表,每一个都指定一个类型和一个有效的标识符作为它的名称。

例如:

struct product {  int weight;  double price;} ;product apple;product banana, melon

这里声明一个数据结构类型的product,并且定义两个数据元素在里面:weight和price,这两个数据的类型还不一样。这样就创建了一个新的数据类型(product),然后就用这个数据类型声明了三个变量:apple、banana,melon。注意product是怎么声明的,同时它与其他变量的用法是一样的。

在struct定义结束后,需要用在结束分号(;),可选字段object_names可直接写上结构类型的对象。例如,apple、banana和melon的结构对象可以末尾被声明的数据结构类型定义:

struct product {  int weight;  double price;} apple, banana, melon;

在这种情况下, object_names指定类型名称就特定了,而类型名字(prodiuct)成为可选的:结构至少需要一个type_name,而object_names确是可选的。

一旦三个对象的结构类型的被声明(apple, banana, melon),其成员就可以直接访问。简单的语法就是在对象名称和成员名称之间插入一个点(.)。例如,如果这些元素在是各自类型的标准变量中,我们可以使用这些元素的任何一种:

apple.weightapple.pricebanana.weightbanana.pricemelon.weightmelon.price

这些类型的数据元素中,apple.weight, banana.weight, 和melon.weight 都指向int类型,而apple.price, banana.price, 和 melon.price 都是 double类型。

下面是一个结构体的具体例子:

// example about structures#include <iostream>#include <string>#include <sstream>using namespace std;struct movies_t {  string title;  int year;} mine, yours;void printmovie (movies_t movie);int main (){  string mystr;  mine.title = "2001 A Space Odyssey";  mine.year = 1968;  cout << "Enter title: ";  getline (cin,yours.title);  cout << "Enter year: ";  getline (cin,mystr);  stringstream(mystr) >> yours.year;  cout << "My favorite movie is:\n ";  printmovie (mine);  cout << "And yours is:\n ";  printmovie (yours);  return 0;}void printmovie (movies_t movie){  cout << movie.title;  cout << " (" << movie.year << ")\n";}

示例显示了一个对象的成员如何作为常规变量。例如,成员yours.year是int类型的有效变量,mine.title是一个字符串类型的有效变量。

但mine和your的对象是同一个类型的变量(类型movies_t)。例如,两者都被传递到函数printmovie,就好像他们是简单变量一样。因此,数据结构的一个特征是它们的成员单独或整个结构都可以作为一个整体。在这两种情况下,都可以使用相同的标识符:结构体的名称。

由于结构的类型结构,它们也可以被用来作为数组的类型来构建它们的表或数据库:

// array of structures#include <iostream>#include <string>#include <sstream>using namespace std;struct movies_t {  string title;  int year;} films [3];void printmovie (movies_t movie);int main (){  string mystr;  int n;  for (n=0; n<3; n++)  {    cout << "Enter title: ";    getline (cin,films[n].title);    cout << "Enter year: ";    getline (cin,mystr);    stringstream(mystr) >> films[n].year;  }  cout << "\nYou have entered these movies:\n";  for (n=0; n<3; n++)    printmovie (films[n]);  return 0;}void printmovie (movies_t movie){  cout << movie.title;  cout << " (" << movie.year << ")\n";}

结构体指针

和其他结构一样,结构体也可以使用指针来指向自己。

struct movies_t {  string title;  int year;};movies_t amovie;movies_t * pmovie;

这里amovie是一个movies_t类型的结构体,而pmovie是一个指向movies_t类型的指针。因此上述代码也可以写成:
pmovie = &amovie;

指针pmovie的值就是结构体amovie的地址。
下面我们来看一个混合了指针与结构体的例子,同时引入一种新的操作符号,箭头操作(->):

// pointers to structures#include <iostream>#include <string>#include <sstream>using namespace std;struct movies_t {  string title;  int year;};int main (){  string mystr;  movies_t amovie;  movies_t * pmovie;  pmovie = &amovie;  cout << "Enter title: ";  getline (cin, pmovie->title);  cout << "Enter year: ";  getline (cin, mystr);  (stringstream) mystr >> pmovie->year;  cout << "\nYou have entered:\n";  cout << pmovie->title;  cout << " (" << pmovie->year << ")\n";  return 0;}

箭头操作符(->)是一个操作符,是使用指针来访问对象成员的独有方式。此操作可以直接从它的地址访问对象的成员。例如,在上面的例子中:
pmovie->title

这一行等价于:
(*pmovie).title

两个表达式,pmovie -> title和(*pmovie).title都是有效的,都是访问数据结构指针所指的pmovie的成员title。它和下面的定义是完全不同的东西:
*pmovie.title
这一句等价为:
*(pmovie.title)

这里本来想得到指向结构体pmovie下的成员title所在地址的值(然而这里并不能得到,因为title不是一个指针类型)。下面的表格总结了指针和结构成员的运算符的可能组合:

Expression What is evaluated Equivalent a.b Member b of object a a->b Member b of object pointed to by a (*a).b *a.b Value pointed to by member b of object a *(a.b)

嵌套结构体

结构也可以嵌套,也就是一个结构本身包含着另一个结构:

struct movies_t {  string title;  int year;};struct friends_t {  string name;  string email;  movies_t favorite_movie;} charlie, maria;friends_t * pfriends = &charlie;

这样声明以后,下面的语句都是有效的:

charlie.namemaria.favorite_movie.titlecharlie.favorite_movie.yearpfriends->favorite_movie.year

(最后两句表达的是同一个语句)

0 0
原创粉丝点击