C++在C语言的基础上衍生出了类这一概念,C语言只是将不同数据封装成一个结构体,而C++的类不仅将数据(成员变量)封装了,并且将对数据的操作(成员函数)封装了
- #include
- using namespace std;
- struct s
- {
- int a;
- void add()
- {
- a++;
- }
- };
- int main()
- {
- s s1;
- s1.a = 0;
- s1.add();
- cout << s1.a << endl;
- return 0;
- }
这里是一个类的例子,但是C++里用更多的使用class来建立一个类,而不是使用struct,二者的区别在于默认访问限定符不同
下面对访问限定符进行介绍
1. public修饰的成员在类外可以直接被访问
2. protected和private修饰的成员在类外不能直接被访问(此处protected和private是类似的)
3. 访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止
4. 如果后面没有访问限定符,作用域就到 } 即类结束。
5. class的默认访问权限为private,struct为public(因为struct要兼容C)
对象就是类实例化出来的,实例化出来的不同对象的成员变量都单独储存,因为每个对象的成员函数都相同,所以将成员函数储存在公共的区域(代码段),节省空间。所以在计算类对象大小时,只需要考虑成员变量和对齐规则就能计算出类对象的大小。对其规则和C语言结构体保持一致
特别的,对于一个空类,它的大小是1,而不是0,原因是编译器给了空类一个字节来唯一标识这个类的对象。
对于成员函数,都隐含了一个this指针
- class example
- {
- public:
- void add()
- {
- a++;
- }
- private:
- int a;
- };
对于这样的一个类,我们知道add是存在代码段的,在add内对a进行++操作,编译器是怎么知道对谁的a进行++呢?
- example e1;
- e1.add();
由于是e1对象调用add函数,所以将e1的地址传给add中隐藏的参数,即this指针。其实在类中声明函数时,实际上编译器都会为函数加上一个参数,这个参数名为this,类型为指向对象的指针,如果将这里的add函数显式写出,就是这个样子
- void add(example*const this)
this指针是*const类型,const修饰指针变量本身,所以它指向的对象不能改变,指向对象的内容可以改变
实际使用不能将this显示式写出,因为编译器会隐式自动加上