C++ 结构体和联合体(第四章)

本文介绍了C++中结构体和联合体的概念及使用方法。详细解释了结构体的定义、初始化,以及何时选择使用结构体而不是类。同时,还探讨了联合体的特点、声明形式及其内存分配方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

结构体

结构体的定义

结构体的初始化

例4-7用结构体表示学生的基本信息

运行结果:

联合体

声明形式

特点

联合体的内存分配

无名联合

例4-8使用联合体保存成绩信息,并且输出。

运行结果:


结构体

  • 结构体是一种特殊形态的类

    • 与类的唯一区别:类的缺省访问权限是private,结构体的缺省访问权限是public

    • 结构体存在的主要原因:与C语言保持兼容

  • 什么时候用结构体而不用类

    • 定义主要用来保存数据、而没有什么操作的类型

    • 人们习惯将结构体的数据成员设为公有,因此这时用结构体更方便

结构体的定义

struct 结构体名称 {
	 公有成员
protected:
    保护型成员
private:
     私有成员
};

结构体的初始化

  • 如果一个结构体的全部数据成员都是公共成员,并且没有用户定义的构造函数,没有基类和虚函数(基类和虚函数将在后面的章节中介绍),这个结构体的变量可以用下面的语法形式赋初值

类型名 变量名 = { 成员数据1初值, 成员数据2初值, …… };

例4-7用结构体表示学生的基本信息

#include#include#includeusing namespace std;

struct Student {	//学生信息结构体
	int num;		//学号
	string name;	//姓名,字符串对象,将在第6章详细介绍
	char sex;		//性别
	int age;		//年龄
};

int main() {
	Student stu = { 97001, "Lin Lin", 'F', 19 };
	cout << "Num:  " << stu.num << endl;
	cout << "Name: " << stu.name << endl;
	cout << "Sex:  " << stu.sex << endl;
	cout << "Age:  " << stu.age << endl;
	return 0;
}

运行结果:

Num:  97001
Name: Lin Lin
Sex:  F
Age:  19

联合体

声明形式

union 联合体名称 {
    公有成员
protected:
    保护型成员
private:
    私有成员
};

特点

  • 成员共用同一组内存单元

  • 任何两个成员不会同时有效

联合体的内存分配

  • 举例说明:

union Mark {	//表示成绩的联合体
	char grade;	//等级制的成绩
	bool pass;	//只记是否通过课程的成绩
	int percent;	//百分制的成绩
};
[object Object]

无名联合

  • 例:

union {
  int i;
  float f;
}
在程序中可以这样使用:
i = 10;
f = 2.2;

例4-8使用联合体保存成绩信息,并且输出。

#include <iostream>
using namespace std;
class ExamInfo {
private:
	string name;	//课程名称
	enum { GRADE, PASS, PERCENTAGE } mode;//计分方式
	union {
		char grade;	//等级制的成绩
		bool pass;	//只记是否通过课程的成绩
		int percent;	//百分制的成绩
	};
public:
	//三种构造函数,分别用等级、是否通过和百分初始化
	ExamInfo(string name, char grade)
		: name(name), mode(GRADE), grade(grade) { }
	ExamInfo(string name, bool pass)
		: name(name), mode(PASS), pass(pass) { }
	ExamInfo(string name, int percent)
		: name(name), mode(PERCENTAGE), percent(percent) { }
	void show();
}

void ExamInfo::show() {
	cout << name << ": ";
	switch (mode) {
	  case GRADE: cout << grade;  break;
	  case PASS: cout << (pass ? "PASS" : "FAIL"); break;
	  case PERCENTAGE: cout << percent; break;
	}
	cout << endl;
}

int main() {
	ExamInfo course1("English", 'B');
	ExamInfo course2("Calculus", true);
	ExamInfo course3("C++ Programming", 85);
	course1.show();
	course2.show();
	course3.show();
	return 0;
}

运行结果:

English: B
Calculus: PASS
C++ Programming: 85

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值