引言:
C++语言兼容C语言的基础上,更多的是面向对象进行编程,即相较于事务处理的流程,更侧重于处理过程中涉及到的类以及对象。今天向大家分享C++中的类与对象相关知识。
1.类的定义:
常使用class关键字定义一个类:由两部分构成,分别是成员属性和成员函数。
class className //类名
{
//成员属性
//成员函数
};
其实C++的类的结构与C语言中的结构体有部分相似之处,不同的是C语言中的结构体不支持在结构体内部定义成员函数,而C++中的类包括成员属性和成员函数两部分。(其实C++中的类也可以用struct关键字来定义,但这两个不同的关键字在定义一个类时有差别,具体细节在后面~)
2.类的定义方式:
类的定义方式有两种:两种方式成员属性均在类中定义,不同之处在于成员函数的定义。
- 成员函数声明和定义不分离
- 成员函数声明和定义分离(xx.h、xx.cpp)
第二种方式注意定义成员函数时要使用类作用域限定符“::”来声明当前函数的所属域,从而与全局函数进行区分,实际上类的定义在某种程度上也可以理解为是一个域范围的限定。
3.类域:
类定义了一个新的作用域,类的所有成员都在类的作用域中。在类外定义成员时,需要使用作用域限定符“::”操作符指明成员属于哪个类域,例如上面提到的成员函数定义和声明分离时,需要指定定义函数的所属域。
例如:定义一个类A,成员函数定义和声明分离
4.类的访问限定符:
类的访问限定符有:public(公有)、protected(保护)、private(私有)
C++的三大特征分别为封装、继承、多态。封装的一部分目的也是为了控制访问权限,例如一个类的成员属性通常不希望我们直接在类外面进行直接访问修改,通常期望我们通过类中的成员函数对成员属性进行访问或修改,则可为成员设置访问限定符,起到访问权限控制的作用。
4.1各访问限定符的权限控制说明:
1.public修饰的成员在类外可以直接被访问。
2.protected和private修饰的成员在类外不能直接被访问。
4.2使用访问限定符注意:
1.访问权限作用域为:从该访问限定符出现的位置开始到下一个访问限定符出现时为止。
2.如果后面没有访问限定符,作用域到类结束。
3.class的默认访问权限为private,struct为public(struct要兼容C语言)
4.3 C++中struct和class区别
C++语言兼容C语言,所以C++中的struct关键字仍可以用于定义一个结构体,同时在C的基础上,C++中struct还可以连同class关键字用于定义类,但这两个关键字在定义类时存在区别,struct定义的类成员默认访问权限是public,而class定义的类成员默认访问权限是private。
5.类的实例化
类只是某种类型数据组合的抽象,而实例化可以获取一个个具体的类的对象。
即类的定义可以理解为声明,实际是不占物理存储空间的,而实例化出的对象实际占用物理空间。
5.1类实例化定义:
使用类的类型创建对象的过程,称为类的实例化。
5.2实例化举例:
实例化一个类A的对象:
6.类的大小:
虽然类的成员既有成员属性,又有成员函数,但类的大小绝大多数情况都是类的大小即为类的全体成员属性大小(类的全部成员属性大小计算需要遵守结构体计算时的对齐规则,可以参照上一篇博客)。
但是存在一些特殊情况,例如一个类中只有成员函数,没有成员属性,为了占位,此时类的大小为1byte。如下图示:
通过类的大小计算,可以得出,类的成员函数并不在类中存储,类的成员函数存在代码段中,因为同一类的每个实例化对象只是成员属性的属性值不同,但是对这些成员属性的操作-即成员函数,是一致的,是可以共享的。所以将对成员属性处理的成员函数存入代码段。
7.类-this指针
通过类的大小计算,可以看到成员函数并不存储在成员类中,而是由实例化后的具体对象去调用函数,那么如果实例化了一个以上的类对象,在对象调用成员函数时,成员函数是如何得知调用者是哪一个对象呢?这就要介绍类中的一个重要概念-this指针。
C++编译器给每个“非静态的成员函数“增加了一个隐藏的指针参数,让该指针指向当前调用成员函数的对象,在函数体中所有“成员变量“的操作,都是通过该指针去访问。只不过操作对用户是透明的,即用户不需要来传递,编译器自动完成。
即引入指向调用成员函数的类对象的指针,作为隐藏参数传给非静态成员函数。
但是通过前面对类大小的计算,可以得知,this指针并不存在类中,实际上,作为形参,this指针一般存在栈区。并且this指针可以为空。
7.1this指针使用注意:
1.在成员函数中可以显示使用this指针,但不能给this指针赋值。
2.this指针作为隐含形参的传递是由编译器自动传递的,无需使用者传递。
以上就是今天分享的全部内容,如果文章有表达不当之处或错误,欢迎在评论区指出或者私信小Q,希望今天的内容能对大家的学习有所帮助,下篇向大家分享类的6个默认成员函数,下篇博客见^-^。