C++面向对象的封装特性:访问权限问题

1.访问权限基本用法

1.1 public访问权限是全局的

public的成员变量,在类的成员方法中可以直接访问。

举个栗子:

class person
{
public:
	int age;
	void set_and_show_age(int age)
	{
		this->age=age;
		std::cout<<"age = "<<age<<std::endl;
	}
};

public的成员变量,在任何外部代码中可以通过类的对象来直接访问。

举个栗子:

person tom;
tom.age=15;
std::cout<<"age = "<<tom.age<<std::endl;

public的成员方法,在类内其他成员方法中可以直接调用。

举个栗子:

class person
{
public:
	int age;
	void eat(void)
	{
		std::cout<<"eating..."<<std::endl;
	}
	void work(void)
	{
		eat();
	}
};

public的成员方法,在任何外部代码中可以通过类的对象来直接访问。

举个栗子:

person tom;
tom.eat();

总结public就是完全不设防,类内类外均可自由访问 。

1.2 private访问权限

private的成员变量,在类的成员方法中可以直接访问。

举个栗子:

class person
{
private:
	int age;
	void set_and_show_age(int age)
	{
		this->age=age;
		std::cout<<"age = "<<age<<std::endl;
	}
};

private的成员变量,在任何外部代码中不可以通过对象来直接访问。

举个栗子:

person tom;
tom.age=15;
std::cout<<"age = "<<tom.age<<std::endl;

编译报错:

main.cpp:13:6: error: ‘int person::age’ is private
  int age;
      ^

private的成员方法,在类内其他成员方法中可以直接调用。

举个栗子:

class person
{
private:
	int age;
	void eat(void)
	{
		std::cout<<"eating..."<<std::endl;
	}
	void work(void)
	{
		eat();
	}
};

private的成员方法,在任何外部代码中不可以通过对象来直接访问。

举个栗子:

person tom;
tom.eat();

编译报错:

main.cpp:12:7: error: ‘void person::eat()’ is private
  void eat(void)
       ^

总结private就是对内不设防,可以自由访问;对外完全设防,无法访问。

1.3 protected访问权限

在访问权限(不涉及类的继承的时候)中,protected效果和private是一样的。

1.4 更多关于访问权限的问题

protected是第三种访问权限修饰符,如果有必要还可以有第4种甚至更多。访问权限叠加类的继承staticfriend等特性后才更加显出复杂性和威力。

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

2.1 访问权限作用①:保护内部资源

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


2.2 访问权限作用②:隐藏外部使用时无需关心的内部细节

class内部使用而外部绝不会用到的成员隐藏起来,以免干扰外部或者不小心被外部修改了。隐藏细节可以降低使用类库的人的难度,调用时只看到对用户有用的东西,这个隐藏其实是把class的作者和使用者专业分工,是很有必要的。例如对于开车来说,司机不需要知道车子内底层部件(比如齿轮)等部件的是怎么做出来的,只需要熟悉在车内可以看到的外层部件(方向盘,手刹,换挡器)的操作就可以了。


2.3 访问权限作用③:其实这就是面向对象的封装特性

封装特性的体现之一就是抽象,抽象的一层意思就是隐藏掉不必要的细节,封装特性的体现之一就是组织和保护,便于整个整体和外部更合理的交流。

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

3.1 只读变量和只写变量

问题:假设一个class中需要一个变量,并且希望外部只能读不能写或者只能写不能读,怎么实现?

解决方案:硬件、操作系统、编程语言都没有直接提供这样的只读或只写的机制,所以只能间接实现:利用访问权限将成员变量设计为private,然后再通过封装成员方法来实现。

如果对一个类内的成员只提供read方法那就是只读成员,如果只提供write方法那就是只写成员。这样的成员经常被称为属性propertyC#等高级编程语言中就源生支撑这种新编程思想。

3.2 为什么C语言不需要这些

C主要做裸机开发和OS内核开发,都是独立一体化程序,不隔离,所以不需要也没法管控权限;C程序一般规模小,不需要管控权限;C程序强调性能,而权限管控一定程度会牺牲性能。

凡事都有两面性,越是高级语言,编程越偏业务逻辑,就越需要权限管控和架构思想这些。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值