(一)结构体
1.概念辨析:
结构体是一种特殊形态的类,
与类的区别是:类的缺省访问权限是private;结构体的访问权限是public。
(缺省访问权限,默认访问权限)
2.定义
- 定义主要用来保存数据,而没有操作类型(查询为主)
- 习惯将结构体数据设为公有,使用结构体更方便
主要是为了同C语言兼容
//结构体的定义
struct 结构体名称{
公有成员//紧跟着大括号之后的成员默认为公有成员
protected:
保护型成员
private:
私有成员
};
3.结构体的初始化
- 一个结构体的全部数据成员都是公又成员
- 没有用户定义的构造函数
- 没有基类和虚函数(第7章)
类型名 变量名 = {成员数据1初值,成员数据2初值}
举例:(出现的小bug,C++的单引号)
单引号是char类型,双引号是字符串类型,
单个符号使用双引号时,代码会提示”操作数类型不兼容“(“char” 和 “const char*”)
# include <iostream>
# include <string>
using namespace std;
struct Student
{//不写访问控制属性,默认为public属性
int num;
string name;
char sex;
int age;
};
int main(){
Student stu = {97001,"Lilin",'F',19};
cout<<"Num:"<<stu.num<<endl;//使用方式;结构体.成员名
cout<<"Num:"<<stu.name<<endl;
cout<<"Num:"<<stu.sex<<endl;
cout<<"Num:"<<stu.age<<endl;
return 0;
}
(二)联合体
1.概念辨析:
相比于类和结构体,最大的区别就是存储空间的共用,优点是避免冗余
- 任何两个成员不会同时有效
- 成员共用一组内存单元
【牛客网经常考察结构体联合体所占存储空间大小】
eg:成绩联合体
# include<string>
# 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;
default:
break;
}
cout<<endl;
}
int main(){
ExamInfo course1("English",'B');
ExamInfo course2("Math",true);
ExamInfo course3("Chinese",85);
course1.show();
course2.show();
course3.show();
return 0;
}
2.联合体的定义
union 联合体名称{//与结构体一致
公有成员
protected:
保护型成员
private:
私有成员
};
(三)枚举类
1.概念辨析
枚举类型:可以自动隐含转换为整数类型(类型定义不是很严格,整数类型的一个子集)
优点:
- 作用域强制限制在枚举类中(无法比较不同类的枚举对象)
- 转换限制(禁止将类型隐含的转换为整数)
- 指定底层类型(定义范围更加丰富)
2.枚举类定义
enum class 枚举类型名:底层类型{枚举值列表}
//默认的底层类型就是int类型