关键字struct和enum以及运算符重载

1.struct

结构体(struct)是根据自己的需要,而定义的变量集合

1.1 struct的定义

第一种:

struct Student
{
	std::string m_name;
	int32_t m_age;
	float m_score;
};

//使用
struct Student stu;

第二种(不建议使用):

struct Student
{
	std::string m_name;
	int32_t m_age;
	float m_score;
}Stu;

struct
{
	std::string m_name;
	int32_t m_age;
	float m_score;
}Stu;

//使用,上述只是定义了一个结构体变量Stu

第三种(一般使用这种):
通过 typedef 关键字来定义结构体的别名,方便后续的使用

typedef struct Student
{
	std::string m_name;
	int32_t m_age;
	float m_score;
}Stu;

typedef struct
{
	std::string m_name;
	int32_t m_age;
	float m_score;
}Stu;

//使用
Stu stu;

1.2 初始化

第一种:
结构体的构造函数初始化,一般建议初始化,防止出现垃圾数据

typedef struct Student
{
	std::string m_name;
	int32_t m_age;
	float m_score;
	
	Student()
	{
		m_name = "";
		m_age = -1;
		m_score = -0.0;
	}
}Stu;

//使用
Stu stu;

第二种:

typedef struct Student
{
	std::string m_name;
	int32_t m_age;
	float m_score;
		
	Student(std::string name,int32_t age,float score):m_name(name),m_age(age),m_score(score){}	
}Stu;

//使用
Stu stu("wang",18,98);

2. 运算符重载

第一种:

typedef struct Student
{
	std::string m_name;
	int32_t m_age;
	float m_score;
	
	Student(std::string name,int32_t age,float score):m_name(name),m_age(age),m_score(score){}
	
	friend bool operator < (struct Student s1, struct Student s2){
        return s1.m_score < s2.m_score;
    }	
}Stu;

使用:

	Stu stu1("wang",18,98);
	Stu stu2("li",18,100);
	
	if(stu1 < stu2){
		cout<<"stu1 has many score";
	}
	else{
		cout<<"stu2 has many score";
	}

第二种:
无friend

typedef struct Student
{
	std::string m_name;
	int32_t m_age;
	float m_score;
	
	Student(std::string name,int32_t age,float score):m_name(name),m_age(age),m_score(score){}
	
	bool operator < (struct Student s1) const {
        return s1.m_score < m_score;
    }	
}Stu;

使用同方法一

3. enum

第一种:
定义

enum Color
{
	black,
	white,
	red
};

使用

int main()
{	
	Color a = Color::white;	
 	cout<<Color::black<<endl;	
	cout<<a<<endl;  //支持隐式转换
    return 0;
}

该种方法会污染外部的作用域,以下使用会报错,在同一作用域下,变量重复定义

/*
以下操作不允许
enum Color
{
	black,
	white,
	red
};

enum Color_Car
{
	black,
	white,
	red
};
*/

第二种:
enum class
定义:

enum class Color
{
	black,
	white,
	red
};

使用:

int main()
{	
	Color a = Color::white;
	cout<<(int)a<<endl;  //不支持隐式转换   
    return 0;
}

enum class 不会污染作用域

enum class Color
{
	black = 1,
	white,
	red
};

enum class Color_Car
{
	black = 20,
	white,
	red
};

使用

int main()
{	
	cout<<"Color::black is: "<<(int)Color::black<<endl;
	cout<<"Color_Car::black is: "<<(int)Color_Car::black<<endl;
	
    return 0;
}

输出:

Color::black is: 1
Color_Car::black is: 20
如果您的结构体中包含 QMap<自定义枚举类型, QMap<自定义枚举类型, 子结构体>>,则需要分别为该结构体、子结构体以及自定义枚举类型定义等号和不等号运算符。 先来看自定义枚举类型的重载运算符。假设该枚举类型的名称为 MyEnum,需要按照以下方式定义 == 和 != 运算符: 复制 enum class MyEnum { A, B, C }; bool operator==(const MyEnum& lhs, const MyEnum& rhs) { return static_cast<int>(lhs) == static_cast<int>(rhs); } bool operator!=(const MyEnum& lhs, const MyEnum& rhs) { return !(lhs == rhs); } 在上述代码中,我们将 MyEnum 转换为 int 类型进行比较,因为 enum class 默认没有定义等号和不等号运算符。 接下来是子结构体的重载运算符,假设子结构体的名称为 SubStruct,包含两个整数 x 和 y,则需要按照以下方式定义 == 和 != 运算符: 复制 struct SubStruct { int x; int y; bool operator==(const SubStruct& other) const { return x == other.x && y == other.y; } bool operator!=(const SubStruct& other) const { return !(*this == other); } }; 最后是包含 QMap<自定义枚举类型, QMap<自定义枚举类型, SubStruct>> 的结构体的重载运算符,假设该结构体的名称为 MyStruct,需要按照以下方式定义 == 和 != 运算符: 复制 struct MyStruct { QMap<MyEnum, QMap<MyEnum, SubStruct>> aa; bool operator==(const MyStruct& other) const { return aa == other.aa; } bool operator!=(const MyStruct& other) const { return !(*this == other); } }; 在上述代码中,我们直接利用了 QMap 的默认等号运算符,因为其已经对子结构体进行了深度比较。因此,我们只需要为 MyStruct 定义等号和不等号运算符,将其与其他 MyStruct 对象进行比较即可。,你的这种方法系统会报错
最新发布
06-18
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值