C++ 是一种多范式编程语言,它支持面向对象编程(OOP)范式。面向对象编程是一种程序设计思想,其中程序由对象组成,每个对象都是一个实例,具有数据和相关操作。在C++中,实现面向对象编程主要通过类和对象。
-
类(Class):类是一种用户定义的数据类型,用于封装数据和操作。类可以看作是对象的蓝图或模板,描述了对象的属性(成员变量)和行为(成员函数)。
C++ 中的类是一种用户定义的数据类型,用于封装数据和相关操作。类可以看作是一种模板,描述了数据的结构和如何对数据进行操作。在类中,可以定义成员变量(数据)和成员函数(操作)。这样的封装使得数据更安全,也更易于维护和重用。
类的简单实例:
类可以在头文件中进行定义,也可以在源文件中进行定义。
class RolePlayer {
public:
double m_PosX;
double m_PosY;
private:
char * m_NPCName;
int m_nHP;
};
在源文件中进行实例化:
RolePlayer role;
在C++中,实例化是指创建一个类的对象。通过实例化,你可以使用类中定义的成员变量和成员函数。获得实例化对象就能够对成员变量或成员函数进行访问。
2.对象(Object):对象是类的一个实例,具有类中定义的属性和行为。通过实例化类,可以创建对象,并 在程序中使用它们。
在类中我定义了4个成员变量,但是此时我只能访问两个,这就涉及到成员的访问权限;在C++中,类的成员(包括成员变量和成员函数)可以通过访问权限属性进行限制。这些属性控制了成员在类内和类外的可见性和访问权限。主要的访问权限属性包括:
1.public: 公有成员可以在类的内部和外部被访问。这意味着类的对象以及类的成员函数可以访问公有成员;
上述示例中RolePlayer类中的公有成员:
public:
double m_PosX;
double m_PosY;
2.private: 私有成员只能在类的内部被访问,类的外部无法直接访问私有成员。即使是类的其他成员函数也不能直接访问私有成员。所有成员默认是私有的。
上述示例中RolePlayer类中的私有成员:
private:
char * m_NPCName;
int m_nHP;
3.protected: 受保护成员可以在类的内部被访问,也可以在派生类中被访问,但在类的外部无法直接访问受保护成员。
补充:
派生类:是通过继承一个或多个已存在的类来创建的新类。派生类继承了其基类(也称为父类或超类)的特性,包括成员变量和成员函数,并且可以添加新的成员变量和成员函数。这种继承机制允许在不重复编写相同代码的情况下,扩展和修改现有类的功能。
在RolePlayer类中添加受保护的成员:
protected:
int m_PP;
发现在实例化出来的role对象中依旧无法进行访问;
事实上若是要对私有成员或者受保护成员进行修改,一般来说会在提供一个公共成员函数接口进行成员的修改或访问;如此时我要对私有成员变量进行赋值(修改)或访问,那么此时就可以编辑一个公共的赋值(修改)函数或和一个公共的访问函数;受保护成员变量同理。
public:
//修改:
void SetHP(int HP) {
m_nHP = HP;
}
//访问:
int GetHP() {
return m_nHP;
}
成员函数的使用:
RolePlayer role;
role.m_PosX = 3.222;
role.m_PosY = 3.233;
role.SetHP(44);
std::cout << role.GetHP() << std::endl;
role.SetHP(44);
对role对象的m_nHP 进行传值,传入的值为44;
role.GetHP():
获取role对象的m_nHP值,获得的值为44;
在类中也可以定义对象相关的行为,如我在类中定义Attack()方法
此时IDE会自动在与头文件同名的.cpp文件中进行行为方法的定义;
此时我们可以注意到IDE自动就将类的类名设置为Attack()方法的命名空间,事实上,在某种程度上,类可以被视为一个单独的命名空间,但它们并不完全等同于命名空间。
总结:
这些权限属性允许你控制成员的访问级别,从而提高了封装性和安全性。通常情况下,成员变量应该被声明为私有的,而成员函数可以根据需要选择公有、私有或受保护。
上述内容就涉及到C++面向对象编程的第一大特性----封装。
封装(Encapsulation):封装是一种将数据和操作绑定在一起的机制,通过将数据成员声明为私有的并提供公有的成员函数来实现。这样可以隐藏数据的具体实现细节,并确保数据的安全性。