深入理解C++中的类和对象
1. 类的定义
在C++中,类使用class
关键字来定义。类定义如下:
class Hero {
// 类的成员变量和方法
};
2. 成员属性
C++类有三个主要的访问控制符:public
、private
和protected
。这些控制符决定了类成员和方法的可见性和可访问性。
- Public(公共):在
public
下声明的成员可以从类的外部访问。 - Private(私有):在
private
下声明的成员只能在类的内部访问。 - Protected(保护):在继承中使用时,子类可以访问。
在代码中,构造函数和一些方法是公共的,而成员变量是私有的。
3. 构造函数
构造函数在对象创建时被调用,用于初始化对象。以下展示两种构造函数:
-
无参数构造函数:
Hero() { m_name = " "; m_SkillCount = 4; m_Blood = 300; cout << "The parameterless constructor is complete" << endl; }
这个构造函数在没有参数时被调用,初始化成员变量。
-
有参数构造函数:
Hero(string name, int Blood) { m_name = name; m_SkillCount = 4; m_Blood = Blood; cout << "Constructor 1 with arguments completes" << endl; }
这个构造函数在传入参数时被调用,根据参数值初始化成员变量。
4. 成员变量
成员变量声明在private
部分,只能通过公共方法访问和修改:
m_name
:可以读写m_SkillCount
:只读m_Blood
:只写
5. 调用接口
-
设置和读取名称:
void setName(string name) { m_name = name; } string readName() { return m_name; }
-
读取技能数量:
int readSkillCount() { return m_SkillCount; }
-
设置血量:
void setBlood(float number) { if (number < 100 || number > 500) { cout << "This is an illegal setting" << endl; return; } m_Blood = number; }
6. 对象实例化
在main
函数中,通过多种方式实例化对象:
int main() {
// 实例化一个对象
Hero ming;
ming.setName("ming");
cout << "The hero's name is " << ming.readName() << endl;
cout << "The Hero's number of skill is " << ming.readSkillCount() << endl;
ming.setBlood(666); // 无效的血量设置
ming.setBlood(333); // 有效的血量设置
// 不同的实例化方式
Hero h1; // 调用无参数构造函数
Hero h2("ming", 400); // 调用有参数构造函数
Hero h3 = Hero{"ming", 330}; // 调用有参数构造函数
Hero h4{"ming", 200}; // 调用有参数构造函数
Hero h5{}; // 调用无参数构造函数
return 0;
}
Hero ming;
:调用无参数构造函数。Hero h1;
:同样调用无参数构造函数。Hero h2("ming", 400);
:调用有参数构造函数。Hero h3 = Hero{"ming", 330};
:使用初始化列表的方式调用有参数构造函数。Hero h4{"ming", 200};
:使用直接列表初始化调用有参数构造函数。Hero h5{};
:使用列表初始化调用无参数构造函数。
代码总结
// 包含输入输出流和字符串库
#include <iostream>
using std::cout;
using std::endl;
using std::string;
// Hero 类的定义
class Hero {
public:
// 无参数构造函数
Hero() {
m_name = " "; // 初始化英雄名为空格
m_SkillCount = 4; // 初始化技能数量为4
m_Blood = 300; // 初始化血量为300
cout << "The parameterless constructor is complete" << endl; // 输出构造函数完成消息
}
// 有参数构造函数
Hero(string name, int Blood) {
m_name = name; // 使用参数初始化英雄名
m_SkillCount = 4; // 初始化技能数量为4
m_Blood = Blood; // 使用参数初始化血量
cout << "Constructor 1 with arguments completes" << endl; // 输出构造函数完成消息
}
private:
string m_name; // 英雄名,可读、可写
int m_SkillCount; // 技能数量,只读
int m_Blood; // 血量,只写
public:
// 设置英雄名
void setName(string name) {
m_name = name;
}
// 读取英雄名
string readName() {
return m_name;
}
// 读取技能数量
int readSkillCount() {
return m_SkillCount;
}
// 设置血量(在100到500之间有效)
void setBlood(float number) {
if (number < 100 || number > 500) { // 如果血量不在有效范围内
cout << "This is an illegal setting" << endl; // 输出非法设置消息
return; // 直接返回,不进行设置
}
m_Blood = number; // 设置血量为传入的参数值
}
};
int main() {
// 实例化一个对象 ming,调用无参数构造函数
Hero ming;
ming.setName("ming"); // 设置英雄名为 "ming"
cout << "The hero's name is " << ming.readName() << endl; // 输出英雄名
cout << "The Hero's number of skill is " << ming.readSkillCount() << endl; // 输出技能数量
ming.setBlood(666); // 尝试设置血量为 666(超出有效范围)
ming.setBlood(333); // 设置血量为 333(在有效范围内)
// 不同的对象实例化方式
Hero h1; // 调用无参数构造函数
Hero h2("ming", 400); // 调用有参数构造函数,设置英雄名为 "ming",血量为 400
Hero h3 = Hero{"ming", 330}; // 调用有参数构造函数,使用初始化列表方式设置英雄名为 "ming",血量为 330
Hero h4{"ming", 200}; // 调用有参数构造函数,使用直接列表初始化设置英雄名为 "ming",血量为 200
Hero h5{}; // 调用无参数构造函数
return 0; // 返回主函数结束
}
运行结果
说明: 本人所写的有关C++面向对象的相关代码是跟着英雄编程的相关课程,自己编写,如有侵权,请与我私下协商。