C++构造类型

C++构造类型

C++提供了多种基本的数据类型(int、char、double等)供用户使用,但是由于程序处理的问题往往比较复杂,而且呈现多样化,已有的基本数据类型很难满足使用要求。为了将不同类型的数据联合起来,作为一个整体进行处理,C++提供了结构体类型(structure)、共用体类型(union)、枚举类型(enumeration)、类类型(class)等,这样的类型成为构造类型。

结构体类型

C语言结构体与C++结构体的区别

C++中结构体类型是从C语言继承而来,是C语言中聚合数据类型(aggregate data type)的一类。结构体可以被声明为变量、指针或数组等,用以实现较复杂的数据结构。声明结构体类型的一般形式如下:

struct 结构体名称{
    数据类型1 成员1;
    数据类型2 成员2;
    .
    .
    .
    数据类型n 成员n;
}

对于结构体成员,可以通过成员运算符”.”对其进行访问。

在C语言中的结构体只涉及到数据结构,而不涉及算法。换句话说C语言中的结构体只能定义成员变量,但不能定义成员函数。而C++对此加以扩充,结构体的成员既可以包括数据(即数据成员),又可以包括函数(即函数成员),以适应面向对象的程序设计。C++中的结构体和类体现了数据结构和算法的结合。

既然C语言的结构体中只能包含成员变量,那么可不可以将指向函数的指针放到结构体中,这样是不是也能实现利用结构体来调用函数呢?答案是肯定的,看下面的例子:

#include <stdio.h>
//定义一个函数
void myfun(int num){
    printf("hello! %d\n", num);
}
//定义结构体
typedef struct {
    int num;
    //指向一个函数的指针
    void (*print)(int);
}Student;
//main函数
int main() {
    Student stu;
    //初始化结构体
    stu.num = 2015;
    //让函数指针print指向myfun()函数
    stu.print = &myfun;
    //调用函数
    stu.print(stu.num);
    return 0;
}

C++结构体和类的区别

C++结构体与类相似,也可以包含构造函数,常数,字段,方法,属性,索引器,运算符和嵌套类型等,不过,结构体是值类型。

概念:class和struct的语法基本相同,从声明到使用,都很相似,但是struct的约束要比class多,理论上,struct能做到的class都能做到,但class能做到的stuct却不一定做的到。

类型:struct是值类型,class是引用类型,因此它们具有所有值类型和引用类型之间的差异。

效率:由于堆栈的执行效率要比堆的执行效率高,但是堆栈资源却很有限,不适合处理逻辑复杂的大对象,因此struct常用来处理作为基类型对待的小对象,而class来处理某个商业逻辑。值类型的内存不由垃圾回收控制,作用域结束时,值类型会自行释放,减少了托管堆的压力,因此具有性能上的优势。因此,结构体没有析构函数。

关系:struct不仅能继承也能被继承 ,而且可以实现接口,不过Class可以完全扩展。内部结构有区别,struct只能添加带参的构造函数,不能使用abstract和protected等修饰符,不能初始化实例字段。

什么时候用结构体呢?结构体使用简单,并且很有用,但是要牢记:结构体在堆栈中创建,是值类型,而类是引用类型。每当需要一种经常使用的类型,而且大多数情况下该类型只是一些数据时,使用结构体能比使用类获得更佳性能。

结构体是值类型,所以会影响性能,但根据使用结构体的方式,这种影响可能是正面的,也可能是负面的。正面的影响是为结构体分配内存时,速度非常快,因为它们将内联或者保存在堆栈中。在结构体超出了作用域被删除时,速度也很快。另一方面,只要把结构体作为参数来传递或者把一个结构体赋给另一个结构体(例如A=B,其中A和B是结构体),结构体的所有内容就被复制,而对于类,则只复制引用。这样,就会有性能损失,根据结构体的大小,性能损失也不同。注意,结构体主要用于小的数据结构。但当把结构作为参数传递给方法时,就应把它作为ref参数传递,以避免性能损失——此时只传递了结构在内存中的地址,这样传递速度就与在类中的传递速度一样快了。另一方面,如果这样做,就必须注意被调用的方法可以改变结构的值。

共用体类型

有时在一组数据中,任何两个数据不会同时有效。例如,当学生和教师放在一个表中的时候,根据职业不同,若是学生,应输入学生的成绩,需要用实数存储;若是教师,则输入教师的工资,需要用整数存储。也就是说,某一时刻,两者只能选择其一,此时可以使用共用体类型来表示。声明共用体类型的一般形式如下:

union 共用体名称{
    数据类型1 成员1;
    数据类型2 成员2;
    .
    .
    .
    数据类型n 成员n;
}

共用体类型数据的特点

  1. 使用共用体变量的目的是希望用同一个内存段存放几种不同类型的数据。但请注意:在每一瞬时只能存放其中一种,而不是同时存放几种。
  2. 能够访问的是共用体变量中最后一次被赋值的成员,在对一个新的成员赋值后原有的成员就失去作用。
  3. 共用体变量的地址和它的各成员的地址都是同一地址。
  4. 不能对共用体变量名赋值;不能企图引用变量名来得到一个值;不能在定义共用体变量时对它初始化;不能用共用体变量名作为函数参数。

枚举类型

枚举是用标识符表示的整型常量的集合。声明枚举类型的一般形式如下:

enum 枚举类型名{枚举元素1, 枚举元素2 ,..., 枚举元素n};
  1. 枚举元素不能同名,若不指定枚举元素的起始值,系统将自动从0开始为每个枚举值设置初值,后面的枚举值依次加一。
    若指定某个枚举元素的值,而下一个枚举元素没有指定值,那么其值是上一个枚举值增加一。
    enum weekDays{Sun=7, Mon=1, Tue, Wed, Thu, Fri, Sat};
    枚举元素Tue,Wed,Thu,Fri,Sat的值分别为2,3,4,5,6。

  2. C++中定义枚举类型变量,可以不用关键字enum。

  3. 若声明无名枚举类型,枚举元素可以作为常量使用。

参考资料

C结构体、C++结构体和C++类的定义和区别

C++结构体和类的区别

C++结构体的定义、初始化和引用

详解C结构体、C++结构体 和 C++类的区别

C++共用体


   转载规则


《C++构造类型》 anhua 采用 知识共享署名 4.0 国际许可协议 进行许可。
 上一篇
C++ STL 标准模板库 C++ STL 标准模板库
简介标准模板库(英文:Standard Template Library,缩写:STL),是一个C++软件库,其中包含4个组件,分别为算法、容器、函数、迭代器。模板是C++程序设计语言中的一个重要特征,而标准模板库正是基于此特征。标准模板库
2020-01-19
下一篇 
C++模板 C++模板
C++模板模板是泛型编程的基础,泛型编程,即以一种独立于任何特定类型的方式编码。模板是创建泛型类或函数的蓝图或公式。C++中使用template关键字来定义模板。 在理解泛型之前,首先我们需要了解什么时泛型编程,简单点来说,因为C++是
2019-12-19
  目录