目录
1 概述
所谓封装,就是将某些东西包装和隐藏起来,让外界无法直接使用,只能通过某些特定的方式才能访问。面向对象将万物都视为“对象”,任何对象都具有特性和行为。我们将其特性称为“成员变量”,将其行为称为“成员函数”,被封装的特性只能通过特定的行为去访问。
2 封装
C++封装通过类(class)来实现。类定义可以使用关键字class和struct.
2.1 class or struct
- class定义类默认成员变量是私有(private)的,可以定义公共(public)成员函数对其进行操作
- struct 定义类默认成员变量是公有的。
例如:
#include <iostream>
class Class1
{
int a; //a是私有的
public:
int get_a() {
return a; }
bool set_a(int v)
{
if(v > MAX_A)
return false;
a = v;
return true;
}
static int const MAX_A = 100;
};
struct Class2
{
double get_b() const {
return b; }
float get_c() const {
return c; }
int a;//a是公有的
private:
double b;//b是私有的
float c;//c是私有的
};
int main(int argc, char *argv[])
{
Class1 class1;
Class2 class2;
std::cout << "class1.a: " << class1.a << std::endl;//该行代码编译会出错
std::cout << "class1.a: " << class1.get_a() << std::endl;
std::cout << "class2.a: " << class2.a << std::endl;
return 0;
}
编译结果:
test_001.cpp:16:25: error: ‘int Class1::a’ is private within this context
16 | std::cout << class1.a << std::endl;
| ^
test_001.cpp:5:9: note: declared private here
5 | int a; //a是私有的
注释出错代码
int main(int argc, char *argv[])
{
Class1 class1;
Class2 class2;
//std::cout << "class1.a: " << class1.a << std::endl;//该行代码编译会出错
std::cout << "class1.a: " << class1.get_a() << std::endl;
std::cout << "class2.a: " << class2.a << std::endl;
std::cout << "class2.b: " << class2.get_b() << std::endl;
std::cout << "class2.c: " << class2.get_b() << std::endl;
}
运行结果:
class1.a: 32512
class2.a: -1067117848
class2.b: 6.89919e-310
class2.c: 0
结果分析:由于类的成员变量没有初始化,所以打印出的是随机数。C++类构造函数可以完成成员变量初始化。
2.2 构造/析构函数
C++构造函数名称与类名相同,析构函数名是~+类名
为前面的类增加构造和析构函数:
class Class1
{
int a; //a是私有的
public:
Class1()
: a(0)
{
std::cout << "Class1() is called" << std::endl;
}
Class1(int v)
: a(v)
{
std::cout << "Class1(int) is called" << std::endl;
}
~Class1()
{
std::cout << "~Class1() is called" << std::endl;
}
int get_a() {
return a; }
};
struct Class2
{
Class2()
: a(1)
,