一、枚举 enum
1.普通枚举,枚举在C++中使用比C使用简单
C语言:
enum Color
{
red,
green,
blue
};
enum Color c = red;
C++语言
enum Color
{
red,
green,
blue
};
Color c = red;
C++认为这种枚举方式会污染名字,即:枚举使用的名字,在同一个作用域不能被变量使用
C++希望 red, green, blue……等枚举变量应该被限制在 Color 作用域里面。类比 struct,假设在 struct中定义了一个叫 Node 的结点变量,Node可以在struct 外部任何地方使用,而且外部也能定义 Node。但是枚举不行,在创建了一个枚举后,在整个作用域内,相同变量名不能被重新使用。
struct Student
{
int id;
char[20] name;
};
enum Person
{
id,
name,
sex
};
struct Student stu;
stu.id = 20;
int id = 10;
// id这个变量名在 struct Student 作用范围内仍然可以使用,并且不影响 struct Student中的变量。
enum Person per = name;
int name = 18; // 报错
// 在枚举中使用的变量名 name 不能被作用范围中其他变量定义使用!
2.C++范围枚举
(2)定义和使用
enum class 枚举名
{
成员.....
};
Color c = Color::red;
(2)示例代码
#include <iostream>
using namespace std;
// 普通枚举
enum Color
{
red,
green = 20,
blue
};
// 范围枚举
enum class Person
{
name,
sex = 44,
age
};
// 范围枚举
enum class Student
{
name,
sex = 21,
age
};
int main()
{
cout << "普通枚举" << endl;
Color c = green;
cout << "c = " << c << endl;
cout << "red = " << red << endl;
cout << "blue = " << blue << endl;
cout << "范围枚举" << endl;
Person per = Person::sex;
Student stu = Student::sex;
cout << "输出 Person sex :" << (int)per << endl;
cout << "输出Person sex :" << (int)stu;
system("pause");
return 0;
}
(3)在C++中使用枚举需要注意的事项
1.对于普通枚举,C++可以使用
枚举名 变量名 = 枚举成员
eg: Color c = red;
C++可以使用这样的方式直接去定义变量,而不需要加上 enum
eg: enum Color c = red; // 可以不用这样去定义变量
2.对于普通枚举,C++/C可以直接使用 cout/printf 直接输出枚举变量的值
eg: cout << c << endl;
printf("%d\n",c);
这里 会对 枚举变量进行隐式转换
3.对于范围枚举,C++必须使用 :: 来获取枚举变量的值
eg: Person per = Person::sex;
使用 Person per = sex; // 会发生错误
4.对于范围枚举,想要输出枚举变量的值,必须做强制类型转换
eg: cout << "输出 Person sex :" << (int)per << endl;
使用 cout << per << endl; // 会发生错误
二、结构体 Struct
C和C++的区别体现在结构体中
(1)C中的 struct
在C语言中,结构体(struct)是一种用户自定义的数据类型,用于组织多个不同类型的数据成员。
- **定义:**结构体通过
struct
关键字进行定义,通常位于函数外部,可以包含多个数据成员,每个成员可以是任意类型的数据。 - **成员访问:**结构体的成员使用点操作符(
.
)进行访问,通过结构体变量的名字加上成员名来访问具体的成员。 - **默认访问权限:**C语言中的结构体成员默认是
public
的,可以在任何地方被访问。 - **没有成员函数:**在C语言中,结构体只能包含数据成员,不能包含成员函数。
- **无继承:**C语言中的结构体不能进行继承操作,即不能有父类和子类的概念。
- **没有构造函数和析构函数:**C语言中的结构体没有构造函数和析构函数的概念,结构体的初始化和清理工作通常由程序员手动完成。
(2)C++中的struct
- **定义:**结构体通过
struct
关键字进行定义,与C语言中的结构体类似,但在C++中,结构体可以包含成员函数、构造函数、析构函数等。 - **成员访问:**结构体的成员仍然可以使用点操作符(
.
)进行访问,但在C++中,可以使用->
操作符访问结构体指针的成员。 - **默认访问权限:**C++中的结构体成员默认是
private
的,可以使用访问修饰符(如public
、private
、protected
)来控制成员的访问权限。 - **成员函数:**C++中的结构体可以包含成员函数,这意味着结构体不仅可以用来组织数据,还可以定义与数据相关的操作。
- **继承:**C++中的结构体可以被继承,可以有父类和子类的概念,可以使用继承和派生等面向对象的特性。
- **构造函数和析构函数:**C++中的结构体可以有构造函数和析构函数,用于对象的初始化和清理工作,可以通过构造函数进行初始化,析构函数进行资源的释放。
三个访问限定修饰符:
public: 公开的,外界可以直接访问
private: 私有的,外界不能直接访问,里面可以直接访问
protected: 受保护的,外界不能直接访问,里面可以直接访问,它的儿子可以访问(这个设计是为了继承而来的,没有继承的时候不需要使用)
当遇到访问限定修饰符后,接下来没有遇到下一个访问限定修饰符后,中间的所有内容都是按照这个访问限定修饰符的访问方式
eg:
class Student
{
public:
int a;
int b;
private:
};
a,b都是 public 的访问方式。
struct 默认访问方式为 public 公有
class 默认访问方式为 private 私有
struct/class的基本使用语法,建议使用class
struct/class 类名
{
默认的访问方式
访问限定符:
……
访问限定符:
……
};
eg: 描述一个人
class Person
{
char* name;
int age;
public:
void Print_Name(); // 成员函数
void Print_Age()
{
cout << age << endl;
}
// C++的封装
// private 只能在类内访问
// public 可以在类内 和 类外访问
// protected 只能在类内访问,不能再 类外访问,它的儿子可以访问
};