C++成长之路(10)——结构体与联合体

一、结构体

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

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

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

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

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

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

结构体的定义

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

结构体的初始化

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

例:用结构体表示学生的基本信息

例程:
#include<iostream>
#include<cstring>
using 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;	//百分制的成绩
};

 

下面我们看一个联合体的例题

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

#include<iostream>
#include<cstring>
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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Cheeky_man

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值