C++类和对象 基础部分
众所周知,C语言是一门面向过程的语言,面向过程简单来说就是直接使用各种函数和数据来解决一件事。而面向对象是谁来使用函数和数据去解决一件事。
C++是一门既可以面向对象也可以面向过程的语言,它能够兼容C语言,并且对C语言进行了许多优化升级,其中最为重要的便是类和对象。
在C++中,struct升级成了类class,类是一种自定义类型,由这种类型声明的变量被称为“对象”,并且在类中,不仅可以定义变量,也可以定义函数。
class和struct的区别
class具有三种访问限定符——公有,私有和保护,其中被保护和私有的成员我们无法在类外面进行访问。struct的默认访问限定符为public(公有),class默认为private(私有)。
为什么会出现类
首先得提到面向对象的三大特性:封装、继承、多态。C语言中数据和方法是分离的,任何人都可以访问和修改,并且函数也是能在随意的位置定义,安全性和可维护性都不高。在C++中,我们将类看作一个整体,函数和变量都被封装在类中,提高可维护性,而不想被随意访问的数据可以用访问限定符进行限制,提高了安全性。
其中,类的函数和变量被称为成员函数和成员变量。在类中定义的函数默认为内联函数,并且类本身不占用空间(但是会开辟一个字节不存储数据,用于占位)。
当成员函数的访问权限为公有时,该函数代码段全部保存在公共代码区,也不占用内存。如下图,date1和date2是两个不同的对象,它们所调用的Print函数访问相同地址。
并且,以下代码也可以运行:class Test { public: void Print() { cout << "Print()" << endl; } private: int a; }; int main() { Test* test1; test1 = nullptr; test1->Print(); //原因就在于成员函数在公共代码区,不需要解引用就可以找到该函数 }
由此可见,类的出现增加了代码的安全性,可维护性,提高了运行效率和空间利用率👍
类的创建与使用
如下代码,类的创建在函数外,全局都能使用。public和private(前期protected与private功能一致)为访问限定符,影响类中该限定符到下一个限定符之间的所有成员,如果不写则默认所有成员为私有。
class ClassName { //class为关键字 ClassName为类名,可以自定义 public: //所有人都可以访问 private: //仅类中能够访问 };
如果要使用类中的成员函数,我们需要创建一个对象,用对象调用函数,方法如下:
class Test { public: void Print() { cout << "Test类的Print函数被调用了!" << endl; } private: }; //大括号以内为类的主体 int main() { Test test1; //类名 对象名 创建一个名为test1的对象 test1.Print() //对象名.成员函数名() }
private下的成员被使用则是不可访问状态,但是在类里面可以访问:
成员函数的声明和定义分离
在某些情况下,将成员函数的声明和定义分离,错误操作会导致找不到声明在哪:
此时需要在成员函数前加上作用域,让定义找到声明的位置就可以使用了
this指针
如下代码,定义了两个对象test1和test2,两个对象分别调用GetNumber,那么编译器怎么分辨是test1调用的该对象还是test2调用的该对象呢🤔
其实是因为C++有一个隐性的指针this获取该对象的地址,并且会放在首个参数的位置,每次调用成员函数都会把对象的地址一起传过去,如下图:
this指针在实参和形参处无法显式的写,只能在类里面使用,并且有const修饰,所以this是个指针常量。此外,this指针是一个形参,一般存在栈里面,vs编译器存在ecx寄存器中直接传递。
结尾
以上便是类和对象的基础部分,之后会对默认成员函数进行解析,如果有疑问或者建议都可以私信笔者交流,大家互相学习,互相进步!🌹