C++ 结构体(struct)的使用

结构体(struct)的使用

结构体是将若干个不同的数据类型的变量或数组封装在一起,以存储自定义的数据结构,方便存储一些复合数据。

结构体的作用

结构体在函数中的作用不是简便,其最主要的作用就是封装。封装的好处就是可以再次利用。让使用者不必关心这个是什么,只要根据定义使用就可以了。

C++中的结构体

在 C++ 中,考虑到 C 语言到 C++ 语言过渡的连续性,对结构体进行了扩展,C++ 的结构体可以包含函数,这样,C++ 的结构体也具有类的功能,与class 不同的是,结构体包含的函数默认为 public,而不是 private。

1. 结构体的定义

结构体可以定义除了自身以外的任何数据类型。

基本格式:

struct Name{
  //一些基本的数据结构或自定义的数据类型
  //基本格式:数据类型 变量名称
};

定义的两种方式:

  1. 在定义结构体类型名时,一起定义结构体变量、结构体数组
struct studentInfo{
  int id;
  char gender;
  char name[20];
  char major[20];
}Alice,Bob,stu[1000];
  1. 按照基本数据类型定义
struct studentInfo Alice;
struct studentInfo stu[1000];

强调:结构体不能定义自己本身,但可以定义自身类型的指针变量。

struct node{
  node n;//不能定义node型变量
  node* next;//可以定义node*型指针变量
};

2. 访问结构体内的元素

两种方法:

  1. “.”操作
  2. “->”操作

studentInfo类型定义为:

struct studentInfo{
  int id;
  char name[20];
  //指针next用来指向下一个学生的地址
  studentInfo* next;
}stu,*p;

访问stu中变量的写法如下:

stu.id
stu.name 
stu.next

访问指针变量p中元素的写法如下:

注:以下两种方法完全等价

(*p).id
(*p).name 
(*p).next

//更简洁的写法
p->id
p->name 
p->next

3. 结构体的初始化

通过定义studentInfo stu结构体变量,然后对其元素逐一赋值,但若结构体内变量很多将会不便。

构造函数来进行初始化。

构造函数:用来初始化结构体的一种函数,它直接定义在结构体中。特点:不需要写返回类型,且函数名与结构体名相同。

  1. 对于一个普通定义的结构体,其内部会生成一个默认的构造函数(但不可见)。
struct studentInfo{
  int id;
  char name[20];
  //默认生成的构造函数
  studentInfo(){}
};

构造函数的函数名和结构体类型名相同;

没有返回值;

没有参数;

没有函数体。

但构造函数的存在,才可以直接定义studentInfo类型的变量而不进行初始化。

如何手动提供id和gender的初始化参数?

struct studentInfo{
  int id;
  char gender;
  //下面的参数用以对结构体内部变量进行赋值
  studentInfo(int_id,char_gender){
    //赋值
    id=_id;
    gender=_gender;
  }
};

_id 和 _gender都是变量名,只要不和已有的变量冲突,用a、b或其他变量名都可以。

构造函数可以将其简化成一行。

struct studentInfo{
  int id;
  char gender;
  //下面的参数用以对结构体内部变量进行赋值
  studentInfo(int_id,char_gender): id(_id),gender(_gender){}
};

因此,在需要时就可以直接对结构体变量进行赋值:

构造函数可以将其简化成一行。

struct studentInfo stu = studentInfo(10086,'M');

注意:如果自己重新定义了构造函数,则不能不经初始化就定义结构体变量。

因为默认生成的构造函数“studentInfo(){}”已经被覆盖了。

因此,需要把“studentInfo(){}”手动加上,既能不初始化就定义结构体变量,又能享受初始化带来的便捷。

意味着:只要参数个数和类型不完全相同,就可以定义任意多个构造函数,以适应不同的初始化场合。

struct studentInfo{
  int id;
  char name[20];
  
  //用以不初始化就定义结构体变量
  studentInfo(){}
  
  //只初始化gender
  studentInfo(char_gender){
    gender=_gender;
  }
  
  //同时初始化id和gender
  studentInfo(int_id,char_gender){
    //赋值
    id=_id;
    gender=_gender;
  }
};

直接使用构造函数:

//结构体Point用于存放平面点的坐标x、y
struct Point{
  int x,y;
  Point(){}//用以不经初始化地定义pt[10]
  Point(int _x,in _y): x(_x),y(_y){}//用以提供x和y的初始化
}p[10];

int main(){
  int num=0;
  for(int i=1; i<=3; i++){
    for(int j=1; j<=3; j++){
      pt[num++]=Point(i,j);//直接使用构造函数
    }
  }
  for(int i=0; i<num; i++){
    printf("%d,%d\n",pt[i].x,pt[i].y);
  }

  return 0;
}

构造函数可以在结构体内元素较多的时候使代码显得精炼,不需要临时变量就可以初始化一个结构体,使得代码更工整。

你可能感兴趣的:(C,/,C++,基础知识,c++,开发语言)