C/C++中枚举(enum)和结构体(struct)的异同

一、枚举 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)是一种用户自定义的数据类型,用于组织多个不同类型的数据成员。

  1. **定义:**结构体通过 struct 关键字进行定义,通常位于函数外部,可以包含多个数据成员,每个成员可以是任意类型的数据。
  2. **成员访问:**结构体的成员使用点操作符(.)进行访问,通过结构体变量的名字加上成员名来访问具体的成员。
  3. **默认访问权限:**C语言中的结构体成员默认是public的,可以在任何地方被访问。
  4. **没有成员函数:**在C语言中,结构体只能包含数据成员,不能包含成员函数。
  5. **无继承:**C语言中的结构体不能进行继承操作,即不能有父类和子类的概念。
  6. **没有构造函数和析构函数:**C语言中的结构体没有构造函数和析构函数的概念,结构体的初始化和清理工作通常由程序员手动完成。
(2)C++中的struct
  1. **定义:**结构体通过 struct 关键字进行定义,与C语言中的结构体类似,但在C++中,结构体可以包含成员函数、构造函数、析构函数等。
  2. **成员访问:**结构体的成员仍然可以使用点操作符(.)进行访问,但在C++中,可以使用 -> 操作符访问结构体指针的成员。
  3. **默认访问权限:**C++中的结构体成员默认是private的,可以使用访问修饰符(如publicprivateprotected)来控制成员的访问权限。
  4. **成员函数:**C++中的结构体可以包含成员函数,这意味着结构体不仅可以用来组织数据,还可以定义与数据相关的操作。
  5. **继承:**C++中的结构体可以被继承,可以有父类和子类的概念,可以使用继承和派生等面向对象的特性。
  6. **构造函数和析构函数:**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 只能在类内访问,不能再 类外访问,它的儿子可以访问
};
  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值