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
是第三种访问权限修饰符,如果有必要还可以有第4种甚至更多。访问权限叠加类的继承
、 static
、friend
等特性后才更加显出复杂性和威力。
2.C++为什么要设计访问权限
2.1 访问权限作用①:保护内部资源
private
的成员是class
内部使用,外部没必要直接访问(读取或赋值),所以干脆在语法上让用户看不见。访问权限的保护是一种语法层面的保护,而非硬件上限制访问,硬件做不了这么细致,最终目的也是为了整个程序更安全。
2.2 访问权限作用②:隐藏外部使用时无需关心的内部细节
将class
内部使用而外部绝不会用到的成员变量隐藏起来,以免干扰外部或者不小心被外部修改了。隐藏细节可以降低使用类库的人的难度,调用时只看到对用户有用的东西,这个隐藏其实是把class
的作者和使用者专业分工,是很有必要的。例如对于开车来说,司机不需要知道车子内底层部件(比如齿轮)等部件的工作原理,只需要熟悉在车内可以看到的外层部件(方向盘,手刹,换挡器)的操作就可以了。
2.3 访问权限作用③:其实这就是面向对象的封装特性
封装特性的体现之一就是抽象,抽象的一层意思就是隐藏掉不必要的细节,封装特性的体现之一就是组织和保护,便于整个整体和外部更合理的交流。
3.访问权限带来的一些新编程理念
3.1 只读变量和只写变量
问题:假设一个
class
中需要一个变量,并且希望外部只能读不能写或者只能写不能读,怎么实现?
解决方案:硬件、操作系统、编程语言都没有直接提供这样的只读或只写的机制,所以只能间接实现:利用访问权限将成员变量设计为
private
,然后再通过封装成员方法来实现。
如果对一个类内的成员只提供read
方法那就是只读成员,如果只提供write
方法那就是只写成员。这样的成员经常被称为属性property
,C#
等高级编程语言中就源生支撑这种新编程思想。
3.2 为什么C语言不需要这些
C
主要做裸机开发和OS
内核开发,都是独立一体化程序,不隔离,所以不需要也没法管控权限;C
程序一般规模小,不需要管控权限;C
程序强调性能,而权限管控一定程度会牺牲性能。凡事都有两面性,越是高级语言,编程越偏业务逻辑,就越需要权限管控和架构思想这些。