四、类的访问限定符及封装
1.访问限定符
当然,在类中呢,C++还提出了一些其他的东西,public和private:
class Stack // 类型 { public: void Push(int x) { // Init(); //... } void Init(int N = 4) //缺省参数 { // ... top = 0; capacity = 0; } private: int* a; int top; int capacity; };
简单地说就是,private是私有,他只能在自己的类中去使用,而public在内外都可以使用,没有限制,这就更好的去使对象完善,方便内外去管理权限并使用。
【访问限定符说明】
1. public 修饰的成员在类外可以直接被访问
2. protected 和 private 修饰的成员在类外不能直接被访问 ( 此处 protected 和 private 是类似的)
3. 访问权限作用域从该 访问限定符 出现的位置开始直到下一个访问限定符出现时为止
class Stack // 类型 { public: void Push(int x) { // Init(); //... } void Init(int N = 4) { // ... top = 0; capacity = 0; } //private: int* a; int top; int capacity; };
若有private,则public的作用域到private,private的作用域到结尾。
若没有,则直接到结尾,整个都为公开public。
5. class 的默认访问权限为 private , struct 为 public( 因为 struct 要兼容 C)
这就是为什么,struct中,变量访问结构体中的值,可以随便访问。
2.封装
面向对象的三大特性:封装、继承、多态。(最重要的三个特性)
在类和对象阶段,主要是研究类的封装特性,那什么是封装呢?
封装:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来
和对象进行交互。
封装本质上是一种管理,让用户更方便使用类。 一种管理方式。
举例说明:
在C语言中,实现栈时,大家如果都很遵循规则,访问栈顶元素时,就会调用Top函数,但是总会有人直接去 打印st.a[top],但是可能此时的top不一定是栈顶,可能也是栈顶的前一个,每个人实现的方式都不同,所以就会出现问题。
但是在C++中,就体现了封装的作用,是一种管理,就会将类的成员变量设置为私有private,就不会让你去访问,只是通过函数接口来访问,这样就不会出现问题。
五、类的作用域和命名空间区别
类定义了一个新的作用域,类的所有成员都在类的作用域中。在类体外定义成员时,需要使用::
作用域操作符指明成员属于哪个类域。
class Person { public: void PrintPersonInfo(); private: char _name[20]; char _gender[3]; int _age; }; // 这里需要指定PrintPersonInfo是属于Person这个类域 void Person::PrintPersonInfo() { cout << _name << " "<< _gender << " " << _age; }
那就会有人想,可不可以这样使用 Person::_age = 1;不是命名空间域访问里面的变量时,就可以通过域操作符来访问吗?
但是这里是有区别的,命名空间域相当于设置了一堵围墙,他将里面的变量围了起来,只能通过域操作符来访问到里面变量,函数等,但是类的作用域(类域)它是一堵虚拟墙,他没有实体,就相当于加了密码锁的一张图纸,没有实质内容的,必须按照图纸造出对象以后,才可以通过域操作符来访问。
类实例化出对象就像现实中使用建筑设计图建造出房子,类就像是设计图 ,只设
计出需要什么东西,但是并没有实体的建筑存在,同样类也只是一个设计,实例化出的对象
才能实际存储数据,占用物理空间