【C++】类的封装 ③ ( 访问控制权限 )

2023-10-15 16:52:38 浏览数 (1)

一、类的封装 : 访问控制权限

1、访问控制权限

在 C 语言中 , 类的成员 的 " 访问控制权限 " 是通过 " 访问修饰符 " 指定的 ;

  • 类的 成员属性 和 成员方法 都可以 设置 访问控制权限 , 都可以被 访问修饰符 所修饰 ;

C 语言 提供了 3 种 访问修饰符 :

  • public : 修饰的 成员变量 和 成员函数 , 是 公开的 , 可以在任何地方访问 , 在 类的内部 和 类的外部 都可以访问 ;
  • protected : 修饰的 成员变量 和 成员函数 , 是 受保护的 , 只能在 类的内部 和 子类的内部 访问 ;
  • private : 修饰的 成员变量 和 成员函数 , 是 私有的 , 只能在 类的内部 访问 ;

2、类的内部 和 类的外部 概念

在上面的 访问控制权限 中 , 涉及到了 类的内部 和 类的外部 两种范围 ;

  • 类的内部 : 指的是定义的 class 类的大括号 { } 范围内 ;
  • 类的外部 : 指的是定义的 class 类的大括号 { } 范围之外的代码 ;

被 private 修饰的 类 的 成员属性 和 成员方法 , 只能在 类内部 , 也就是 class 类的大括号 { } 范围内 被访问到 ;

一旦出了类 , 类中的 private 成员 和 protected 成员 便不能被访问到 ;

示例代码分析 :

  • 在 类的内部 , 可以访问所有的 3 种成员变量 ,
  • 在 类的外部 , 只能访问 publicVar 成员变量 ,
  • 还有一种特殊情况 , 就是在 MyClass 子类的内部 , 可以访问 protectedVar 成员变量 , 该 protectedVar 成员变量不能在 类的外部 访问 , 只能在 类的内部 或 子类的内部 被访问到 ;
代码语言:javascript复制
// 定义类 : 通过 访问修饰符 测试 类的 访问控制权限
class MyClass {
public:
	int publicVar;		// 公开成员变量  

protected:
	int protectedVar;	// 受保护成员变量  

private:
	int privateVar;		 // 私有成员变量  
};

3、默认访问控制权限

如果变量没有指定 访问修饰符 , 那么 默认的访问控制权限 是 私有的 , 默认被 private 修饰 ;

代码语言:javascript复制
// 定义类 : 通过 访问修饰符 测试 类的 访问控制权限
class MyClass {
	int defaultVar;		// 默认成员变量 - 私有成员变量
public:
	int publicVar;		// 公开成员变量  

protected:
	int protectedVar;	// 受保护成员变量  

private:
	int privateVar;		 // 私有成员变量  
};

二、代码示例 - 访问控制权限


1、错误代码示例 - 类的 访问控制权限

错误代码示例 :

代码语言:javascript复制
// 包含 C   头文件
#include "iostream"

// 使用 std 标准命名空间
//		该命名空间中 , 定义了很多标准定义
using namespace std;

// 定义类 : 通过 访问修饰符 测试 类的 访问控制权限
class MyClass {
	int defaultVar;		// 默认成员变量 - 私有成员变量
public:
	int publicVar;		// 公开成员变量  

protected:
	int protectedVar;	// 受保护成员变量  

private:
	int privateVar;		 // 私有成员变量  
};

int main()
{
	// 定义类对象
	MyClass obj;

	// 访问类的 公开成员变量
	obj.publicVar = 10;

	// 访问类的 私有成员变量
	obj.privateVar = 10;

	// 访问类的 受保护成员变量
	obj.protectedVar = 10;

	// 访问类的 默认类型成员变量
	obj.defaultVar = 10;

	// 控制台暂停 , 按任意键继续向后执行
	system("pause");
    return 0;
}

执行结果 :

代码语言:javascript复制
已启动生成…
1>------ 已启动生成: 项目: HelloWorld, 配置: Debug Win32 ------
1>hello_world.cpp
1>D:02_Project06_Visual_StudioHelloWorldHelloWorldhello_world.cpp(30,5): error C2248: “MyClass::privateVar”: 无法访问 private 成员(在“MyClass”类中声明)
1>D:02_Project06_Visual_StudioHelloWorldHelloWorldhello_world.cpp(18): message : 参见“MyClass::privateVar”的声明
1>D:02_Project06_Visual_StudioHelloWorldHelloWorldhello_world.cpp(9): message : 参见“MyClass”的声明
1>D:02_Project06_Visual_StudioHelloWorldHelloWorldhello_world.cpp(33,5): error C2248: “MyClass::protectedVar”: 无法访问 protected 成员(在“MyClass”类中声明)
1>D:02_Project06_Visual_StudioHelloWorldHelloWorldhello_world.cpp(15): message : 参见“MyClass::protectedVar”的声明
1>D:02_Project06_Visual_StudioHelloWorldHelloWorldhello_world.cpp(9): message : 参见“MyClass”的声明
1>D:02_Project06_Visual_StudioHelloWorldHelloWorldhello_world.cpp(36,5): error C2248: “MyClass::defaultVar”: 无法访问 private 成员(在“MyClass”类中声明)
1>D:02_Project06_Visual_StudioHelloWorldHelloWorldhello_world.cpp(10): message : 参见“MyClass::defaultVar”的声明
1>D:02_Project06_Visual_StudioHelloWorldHelloWorldhello_world.cpp(9): message : 参见“MyClass”的声明
1>已完成生成项目“HelloWorld.vcxproj”的操作 - 失败。
========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========

0 人点赞