前言
本篇博客主要介绍类与对象的一些基本概念以及this指针
🎓作者:如何写出最优雅的代码
📑如有错误,敬请指正🌹🌹💬开发工具:VS2019
我们不可以这么颓废,我们要努力奋斗,从新开始!
目录
类的引入
C语言结构体中只能定义变量,在C++中,结构体内不仅可以定义变量,也可以定义函数,C++中的类就是从结构体升级而来的。但C++类的定义一般不使用struct关键字,更喜欢使用class关键字来替代。
类的定义
class ClassName
{
//类体:由成员函数和成员变量组成
……
};//分号别漏了
class为定义类的关键字,ClassName为类名,{ } 为类的主体,注意最后的分号不能省略!
类中的成员分为两类:类中的变量称为类的属性或者成员变量,类中的函数称为类的方法或者成员函数。
类的两种定义方式:
1、声明和定义全部放在类体中,成员函数如果在类体中定义,无论是否有inline关键字,编译器可能会把它当成内联函数处理
//Test.h class Student { public: void show() { std::cout << _name << " " << _age << " " << _sex << std::endl; } private: char* _name; int _age; int _sex; };
2、类声明放在.h文件,成员函数定义放在.cpp中,成员函数名前要加类名
//Test.h class Student { public: void show();//声明 private: char* _name; int _age; int _sex; }; //Test.cpp #include "Test.h" void Student::show() { std::cout << _name << " " << _age << " " << _sex << std::endl; }
一般情况下,更推荐使用第二种方式!
C++的命名风格
驼峰法:单词和单词之间首字母大写间隔,比如GetYear
STL中的命名风格:单词全部小写,单词和单词之间用下划线_分隔,比如get_year
有以下规范:
- 函数名、类名等所有单词首字母大写
- 变量首字母小写,后面单词首字母大写
- 成员变量,首字母前加下划线_,后面单词首字母大写
类的访问修饰符及封装
- C++实现封装的方式,用类将对象的属性和方法结合在一起,让对象更加完善,通过访问修饰符限制访问权限,选择性地将函数接口提供给外部用户
- 访问修饰符主要有:public(公有)、protected(包护)、private(私有)
-
访问权限说明
- public修饰的成员在类外可以直接被访问
- protected和private修饰的成员在类外不能被直接访问(这里的protected和private是类似的作用)
- 访问权限作用域从该访问修饰符出现的位置开始直到下一个访问修饰符出现为止
- 如果后面没有访问修饰符,作用域就到{ }; 即类结束
- class的默认访问权限为private,struct为public(因为struct要兼容C语言,因此在C++中定义类时更喜欢使用class)
封装是面向对象程序设计的三大特性之一,将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行交互。封装本质就是一种管理,让用户更加方便地使用类。
类的作用域:类定义了一个新的作用域,类的所有成员都在类的作用域中。在类体外定义成员(声明和定义分离的情况),需要使用::作用域操作符指明成员属于哪个类域。
类的对象
用类类型创建对象的过程,即类的实例化
类是对对象进行描述的,是一个从实例对象抽象出来的模板,限定了类有哪些成员,定义出一个类并没有分配实际的内存空间来存储它,只有实例化出对象,该对象才会占用实际的物理空间,存储类成员变量
类对象的存储方式:对象中包含类的各个成员,只保存成员变量,成员函数存放在公共的代码区,因为不同的对象都会调用同一份函数,因此在计算类的大小(对象的大小)时,不考虑成员函数所占大小(只有在调用时才会产生压栈消耗),仅计算成员变量的大小(即成员属性的大小)。类大小的计算规则遵循C语言结构体内存的对齐规则,规则如下:
- 第一个成员在于结构体偏移量为0的地址处
- 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处:对齐数 = 编译器默认的一个对齐数与该成员变量大小的较小值,在vs中默认对齐数是8字节
- 结构体总大小为最大对齐数(所有变量类型最大值与默认对齐参数取最小)的整数倍
- 如果嵌套了结构体的情况,嵌套结构体对齐到自己的最大对齐数的整数倍处,结构体整体的大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍
this指针
C++中引入了this指针,C++编译器给每个“非静态的成员函数”增加了一个隐藏的指针参数,让该指针指向当前对象(函数运行时调用该函数的对象),在函数体中所有“成员变量”的操作,都是通过该指针去访问,只不过所有的操作对用户是透明的,即用户不需要自己来传递,编译器自动完成!
this指针特性:
- this指针的类型:类类型* const,即成员函数中,不能给this指针赋值。
- 只能在“成员函数”的内部使用
- this指针本质上是成员函数的隐含形参,当对象在调用成员函数时,将该对象的地址作为实参传递给this形参,所以对象中不存储this指针!
- this指针是成员函数第一个隐含的指针形参,一般情况下由编译器通过ecx寄存器自动传递,不需要用户传递
- 实参和形参位置不能显式地传递和接收this指针,但是可以在成员函数的内部使用this指针
- this指针是一个非静态成员方法的形参,只要不解引用,它可以为空值nullptr,且一般存储在栈区!也可能存储在寄存器,取决于编译器,比如在vs下传递this指针,是通过ecx寄存器传递的,这样可以使this访问提高效率!
往期文章推荐:
学习记录:
- 📆本篇博客整理于2022.9.6
- 🎓作者:如何写出最优雅的代码
- 📑如有错误,敬请指正🌹🌹
- 🥂关注一波不迷路!如果觉得写的不错,看完了别忘了点赞和收藏啊,感谢支持😏😏