C++学习笔记:struct结构体

1.结构体概述

C++语言中的2种类型:原生类型(如intchar等)和自定义类型(如classstructenum等)。结构体类型是一种自定义类型,是一个或多个变量的集合,这些变量的类型可以不同。

例如一名学生可以由姓名和性别来描述,结构体中的成员也可以是一个结构体,例如名字由姓+名来描述。结构体由关键字struct来声明。

2.结构体的定义和使用

结构体使用时可以先定义好结构体类型,然后再用定义好的类型来定义变量。访问结构体成员则是变量名.成员名,举个栗子:

#include<stdio.h>

struct student{
    
    	//定义结构体类型
	char name[20];
	int age;
};

int main(int argc,char**argv)
{
    
    
	struct student a;//用定义好的结构体类型来定义变量
	a.age=20;//访问结构体成员
	printf("%d.\n",a.age);
	return 0;
}

结构体也可以在定义结构体类型的同时定义结构体变量,下面这段代码就是在定义了一个struct student结构体类型的同时定义了一个struct student类型的变量stu

#include<stdio.h>

struct student{
    
    	//定义结构体类型
	char name[20];
	int age;
}stu;//定义结构体类型的同时定义了一个struct student类型的变量stu

int main(int argc,char**argv)
{
    
    
	stu.age=20;//访问结构体成员
	printf("%d.\n",stu.age);
	return 0;
}

这里要注意,当使用typedef来对结构体类型重命名的时候,例如下面这段代码,{}后面跟着的stu是新的类型名,而不再是个变量:

#include<stdio.h>

typedef struct student{
    
    	//定义结构体类型
	char name[20];
	int age;
}stu;//stu是新的类型名 而不是一个变量

int main(int argc,char**argv)
{
    
    
	stu a;
	a.age=20;
	printf("%d.\n",a.age);
	return 0;
}

3.从数组到结构体的进步之处

结构体可以认为是从数组发展而来的。其实数组和结构体都算是数据结构的范畴了,数组就是最简单的数据结构、结构体比数组更复杂一些,链表、哈希表之类的比结构体又复杂一些;二叉树、图等又更复杂一些。

数组有2个明显的缺陷:

  • 1.定义时必须明确给出大小,且这个大小在以后不能再更改;
  • 2.数组要求所有的元素的类型必须一致,更复杂的数据结构就致力于解决数组的这两个缺陷;

结构体就是用来解决数组的第二个缺陷的,可以将结构体理解为一个其中元素类型可以不相同的数组。结构体完全可以取代数组,只是在数组可用的范围内数组比结构体更简单。

4.结构体变量中的元素访问

数组中元素的访问方式表面上有2种:数组下标方式和指针方式,实质上这两种都是指针方式访问。

结构体变量中的元素访问方式只有一种,用 .或者 ->的方式来访问。当通过变量名来访问成员是就用变量名.成员名来访问,当通过指针来访问成员时,就用指针名->成员名来访问,举个栗子:

#include<stdio.h>
#include<stdlib.h>

typedef struct student{
    
    	//定义结构体类型
	char name[20];
	int age;
}stu;//stu是新的类型名 而不是一个变量

int main(int argc,char**argv)
{
    
    
	//通过变量名来访问成员是就用变量名.成员名来访问
	stu a;
	a.age=20;
	printf("%d.\n",a.age);

	//通过指针来访问成员时,就用指针名->成员名来访问
	stu* pa=(stu*)malloc(sizeof(stu));
	//C++可以用new
	//stu* pa=new stu;
	pa->age=30;
	printf("%d.\n",pa->age);
	return 0;
}

这里要注意的就是第17行,当定义一个结构体指针的时候还要手动申请一个该结构体的内存,然后把返回的指针给声明的结构体指针,才能用->正确引用。否则内存中只分配了指针的内存,没有分配结构体的内存,结构体实际上是不存在的。这时候用->引用会导致Segmentation fault (core dumped)

结构体的访问方式有点类似于数组下标的方式,结构体变量成员的 .或者 ->访问本质上还是用指针来访问的。

5.struct和class的区别

5.1 C和C++中struct的区别

①在C语言中结构体不支持成员函数(只能通过函数指针成员变量间接支持),而C++源生支持。

C语言中不支持static成员,而C++中支持,C++ static class是一个大知识点。

③在访问权限上,C语言结构体内的成员默认并且永远都是public的,C++中也默认public,但是也可以显式指定为publicprivateprotected三者之一。

④继承特性上,C语言中不支持继承(只能通过结构体包含来间接实现),而C++源生支持,且structclass可以互相继承。

⑤初始化方面,C语中靠初始化式(gcc扩展了初始化语法),而C++靠构造函数,所以初始化更自由可定制化。

5.2 C++中struct和class的区别

①默认成员权限,struct默认publicclass默认private

②继承关系的权限管控,struct默认publicclass默认private

structclass交叉继承时,默认的权限管控取决于子类而不是基类。

④模板相关使用都用class而不用struct了。

5.3 总结

C++structclass差别不大,大多数情况下都可以直接替换使用而不出错,但是C++struct其实有点“人格分裂”,他既要兼容Cstruct,又要像C++class

除非是只需要打包几个变量数据就用C方式的struct,否则如果需要面向对象式编程就用class

猜你喜欢

转载自blog.csdn.net/PecoHe/article/details/112798649