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就是完全不设防 。

扫描二维码关注公众号,回复: 12436364 查看本文章

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是第三种访问权限修饰符,如果有必要还可以有第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程序强调性能,而权限管控一定程度会牺牲性能。凡事都有两面性,越是高级语言,编程越偏业务逻辑,就越需要权限管控和架构思想这些。

猜你喜欢

转载自blog.csdn.net/PecoHe/article/details/113120674