在前两章节中,我们学习了类的创建,封装,继承,构造函数和析构函数,其中很多都提到了权限,由于我们是从C语言过渡过来的,所以当时没有过多讲解,这一章节我们来讲解一下权限的控制和权限的继承。
一.类的创建规范
之前章节在创建类的时候,我们通常将构造函数定义在类成员中,由于这样可读性较差,所以我们需要将构造函数,析构函数的定义写在类中,将函数的实现定义在外部:
案例:
struct Base{ int a; int b; Base(); Base(int a,int b); !Base(); }; Base::Base(int a,int b){ this->a = a; this->b = b; }
**需要注意的是,在类外部写函数实现的时候,需要在前面加上类名和::,告诉编译器这是类中的函数,否则编译器不认识这到底是类中的函数还是你定义的新函数。
二.public和private
我们在上一章节链接: C++ 类,this指针中讲解过权限控制符的具体介绍,不了解的可以去看一下,由于protected不经常使用,所以我们这里只介绍public和private。
我们来看看这样一段程序:
#include <stdio.h> struct Base{ public: int a; int b; private: int c; int d; }; void Test(){ Base t; t.a=1; t.b=2; t.c=3; t.d=4; } int main(){ Test(); return 0; }
在编译的时候,我们可以看到出错误了,具体内容为:cannot access private member declared in class 'Base'
告诉我们不能访问Base类中的成员c和d。
那么这就很好地体现了C++中的权限控制:
1.对外提供的函数或变量,发布成public的,但是后续不能随意更改。
2.可能会变动的函数或者变量,定义为private,这样在使用的时候编译器会自动检测。
3.只有结构体内部的成员(构造函数,析构函数和变量)可以访问private成员。
4.public/private可以修饰函数,也可以修饰变量。
三.public成员真的不能访问吗
在上面的程序中我们明显看到是不能访问的,但是对于学习底层的我们来说,我们还是可以访问的,我们可以通过指针来访问:
比如说这段代码:
#include <stdio.h> struct Base{ public: int a; int b; Base(int a,int b,int c,int d){ this->a = a; this->b = b; } private: int c; int d; }; void Test(){ Base t(1,2,3,4); int* p; p = (int*)&t; printf("%d\n",*p); printf("%d\n",*(p+1)); } int main(){ Test(); return 0; }
我们能看到函数输出窗口还是输出了a和b的值。所以说private的成员还是能访问的,但是我们要通过强制转化指针来访问。