前言
本文简单介绍类的三大特性之一——封装。
一、什么是封装?
- 类的主要组成为:
- 成员变量(数据)
- 成员函数(操纵数据的方法)
- 一般设计类时,默认会将类的成员变量设置为私有(即private,只有在类内或者类的友元才可以访问类的私有成员变量),而将成员函数设置为公有(即public,类外或者类对象都可以访问),这样只对外暴露一种接口而隐藏实现细节就叫做封装。
二、封装的体现
一个简单的玩家类Player
如下面代码所示:
#include <iostream>
class Player
{
private:
std::string m_Name;
int m_Age;
public:
Player() : m_Name("Unknow"), m_Age(0){};
Player(std::string name, int age)
: m_Name(name), m_Age(age){}
std::string GetName(){ return m_Name; }
int GetAge(){ return m_Age; }
friend void ModifyAge(Player& p, int age);
};
void ModifyAge(Player& p, int age){ p.m_Age = age; }
int main()
{
Player young("Young", 18);
young.m_Age = 17; //Error: 'm_Age' is a private member of 'Player'
std::cout << "age: " << young.GetAge() << std::endl;// Output: age: 18
Modify(young, 17);
std::cout << "name: " << young.GetName() << std::endl;// Output: name: Young
std::cout << "age: " << young.GetAge() << std::endl;// Output: age: 17
}
其中,m_Name
和m_Age
是类Player
的两个私有成员变量,在类外访问会报错,如这行代码所示young.m_Age = 17;
;尽管无法直接使用类对象直接修改私有成员变量,但通过调用类的友元函数,如void Modify(Player& p, int age);
可以完成对私有成员变量m_Age
的修改。
而通过类对象young
可以正常访问两个公有成员函数GetName
和GetAge
。
总结
主要介绍了封装的概念以及通过友元访问类的私有成员变量。