【C++的面向对象】------- 类成员的访问权限


public,private,protect的访问权限问题(先不考虑继承和多态的关系)


1、public访问权限是全局的

public的成员变量在类的成员方法中可以直接访问
public的成员变量在外部代码中可以通过类的对象来直接访问
public的成员方法在类内其他成员方法中可以直接调用
public的成员方法在外部代码中可以通过类的对象来直接访问

2、private访问权限就是对内不设防,对外设防的

private的成员变量在类的成员方法中可以直接访问
private的成员变量在外部代码中不可以通过对象来直接访问
private的成员方法在类内其他成员方法中可以直接调用
private的成员方法在外部代码中不可以通过对象来直接访问

3、protected访问权限就是对内不受保护,对外受保护的

protected的成员变量在类的成员方法中可以直接访问
protected的成员变量在外部代码中不可以通过对象来直接访问
protected的成员方法在类内其他成员方法中可以直接调用
protected的成员方法在外部代码中不可以通过对象来直接访问

注:访问权限叠加类的继承、static、friend等特性后才更加显出复杂性和威力;暂时只先引入这个概念,掌握基本用法和规则即可,后面逐步去深入


C++为什么要设计访问权限


1、访问权限作用1:保护内部资源
(1)private的成员是class内部使用,外部没必要直接访问(读取或赋值),所以干脆在语法上让你看不见
(2)访问权限的保护是一种语法层面的保护,而非硬件上限制访问,硬件做不了这么细致
(3)最终目的也是为了整个程序更安全

2、访问权限作用2:隐藏外部无需关心的细节
(1)将class内部使用而外部绝不会用到的成员变量隐藏起来,以免干扰外部或者不小心被外部修改了
(2)隐藏细节可以降低使用类库的人的难度,调用时只看到对我有用的东西
(3)这个隐藏其实是把class的作者和使用者专业分工,是很有必要的

3、这就是面向对象的封装特性
(1)封装特性的体现之一就是抽象,抽象的一层意思就是隐藏掉不必要的细节
(2)封装特性的体现之一就是组织和保护,便于整个整体和外部更合理的交流


访问权限带来的一些新编程理念


1、只读或只写变量
(1)问题:你的class中需要一个变量,但是希望外部只能读不能写,怎么实现?
(2)分析:硬件、OS、编程语言都未提供这样的RO或WO的机制,只能间接实现了
(3)解决方案:利用访问权限,将成员变量设计为private,然后再通过封装成员方法来实现
(4)如果只提供read方法那就是只读成员,如果只提供write方法那就是只写成员
(5)这样的成员经常被称为属性(property),C#等高级编程语言中就源生支撑这种新编程思想


/********person.hpp*********/
#ifndef __PERSON_H__
#define __PERSON_H__

#include <string>
using namespace std;

// 声明这个类
class person
{
public:
	// 提供一个专门用来写age成员变量的方法
	void agewrite(int a);
	int ageread();
	
private:
	int age;				// 我们希望age是只写不能读的
	
protected:

};
#endif
/********person.cpp*********/
#include "person.hpp"
#include <iostream>

using namespace std;

// age成员变量的读写方法
void person::agewrite(int a)
{
	this->age = a;
}

int person::ageread()
{
	return this->age;
}
/********main.cpp*********/
#include "person.hpp"
#include <iostream>


using namespace std;

int main(void)
{
	person zhangsan;    			
//	zhangsan.age = 23;            //不能直接在外部写private变量,报错

	zhangsan.agewrite(23);		       // 通过写方法来间接的实现了读写成员	
	int a = zhangsan.ageread();
	cout << "a = " << a << endl;
		
	return 0;
}

2、复杂程序架构化
(1)简单程序规模小,参与人少,靠人本身的逻辑能力就能保证实现和质量
(2)复杂程序规模大参与人多,协作成本高,水平良莠不齐,必须靠架构式设计才能保证实现和质量
(3)架构化设计中权限管控的思想很重要,每一层的访问权限和主要关注点都不同

3、为什么C语言不需要这些
(1)C主要做裸机开发和OS内核开发,都是独立一体化程序,不隔离,所以不需要也没法管控权限
(2)C程序一般规模小,不需要管控权限
(3)C程序强调性能,而权限管控一定程度会牺牲性能。凡事都有两面性。
(4)越是高级语言,编程越偏业务逻辑,就越需要权限管控和架构思想这些。


扩展:


1、C和C++中struct的区别
(1)C中不支持成员函数(只能通过函数指针成员变量间接支持),而C++源生支持成员函数。
(2)C中不支持static成员,而C++中支持。后面会详细讲,C++ static class是一个大知识点。
(3)访问权限,C中默认public,C++中默认public,但是可以显式指定public/private/protected三者之一
(4)继承特性上,C中不支持(只能通过结构体包含来间接实现),而C++源生支持,且struct和class可以互相继承
(5)初始化方面,C中靠初始化式(gcc扩展了初始化语法),而C++靠构造函数所以初始化更自由可定制化

2、C++中struct和class的区别
(1)默认成员权限,struct默认public,class默认private
(2)继承关系的权限管控,struct默认public,class默认private
(3)struct和class交叉继承时,默认的权限管控取决于子类而不是基类
(4)模板相关使用都用class,而不用struct了

3、总结
(1)C++中struct和class差别不大,大多数情况下都可以直接替换使用而不出错
(2)C++中struct其实有点“人格分裂”,他既要兼容C中struct,又要像C++的class
(3)结论:除非是只需要打包几个变量数据就用C方式的struct,否则如果需要面向对象式编程就用class

4、class的前置声明
(1)就是class的声明,有点像函数声明,安慰编译器的
(2)看到了认识即可。

5、inline member function
(1)类的声明中直接写函数体,则此函数会被编译器inline化处理
(2)类的声明中正常处理,而成员函数的实现中加inline
(3)inline的成员函数应该放在hpp中而不是cpp中,这个一定要注意,因为inline是在编译时替换的

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++中的继承和派生是面向对象编程中的重要概念。在C++中,可以使用公有继承、保护继承和私有继承来实现的继承和派生。 公有继承是最常见的一种继承方式,它可以使得基的公有成员在派生中仍然是公有的,保护成员在派生中变为保护的,私有成员在派生中不可访问。\[1\] 保护继承是一种特殊的继承方式,它可以使得基的公有和保护成员在派生中变为保护的,私有成员在派生中不可访问。\[2\] 私有继承是一种特殊的继承方式,它可以使得基的公有和保护成员在派生中变为私有的,私有成员在派生中不可访问。私有继承主要用于实现"实现继承",即派生通过继承基的实现来实现自己的功能。\[3\] 在派生中,可以使用基成员函数和成员变量,但是访问权限受到继承方式的限制。公有继承和保护继承可以访问基成员函数和成员变量,私有继承只能在派生内部访问基成员函数和成员变量。 总结起来,C++中的继承和派生可以通过公有继承、保护继承和私有继承来实现,不同的继承方式决定了派生对基成员访问权限。 #### 引用[.reference_title] - *1* *2* [C++ 面向对象 - 的继承与派生](https://blog.csdn.net/m0_62598965/article/details/124610795)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [C++面向对象-继承和派生](https://blog.csdn.net/D23333A/article/details/116640148)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值