C++类和对象 前篇

C++类和对象 基础部分

​ 众所周知,C语言是一门面向过程的语言,面向过程简单来说就是直接使用各种函数和数据来解决一件事。而面向对象是谁来使用函数和数据去解决一件事。

​ C++是一门既可以面向对象也可以面向过程的语言,它能够兼容C语言,并且对C语言进行了许多优化升级,其中最为重要的便是类和对象

​ 在C++中,struct升级成了类class,类是一种自定义类型,由这种类型声明的变量被称为“对象”,并且在类中,不仅可以定义变量,也可以定义函数

class和struct的区别

class具有三种访问限定符——公有,私有和保护,其中被保护和私有的成员我们无法在类外面进行访问。struct的默认访问限定符为public(公有),class默认为private(私有)。

为什么会出现类

首先得提到面向对象的三大特性:封装、继承、多态C语言中数据和方法是分离的,任何人都可以访问和修改,并且函数也是能在随意的位置定义,安全性和可维护性都不高。在C++中,我们将类看作一个整体,函数和变量都被封装在类中,提高可维护性,而不想被随意访问的数据可以用访问限定符进行限制,提高了安全性。

image-20240711204455549

​ 其中,类的函数和变量被称为成员函数成员变量。在类中定义的函数默认为内联函数,并且类本身不占用空间(但是会开辟一个字节不存储数据,用于占位)
​ 当成员函数的访问权限为公有时,该函数代码段全部保存在公共代码区,也不占用内存。如下图,date1和date2是两个不同的对象,它们所调用的Print函数访问相同地址。
image-20240711230555098
​ 并且,以下代码也可以运行:

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() //对象名.成员函数名()
}

image-20240711234143675
private下的成员被使用则是不可访问状态,但是在类里面可以访问
image-20240711234520435

image-20240711234615139

成员函数的声明和定义分离

​ 在某些情况下,将成员函数的声明和定义分离,错误操作会导致找不到声明在哪:

image-20240711235447051

image-20240711235546810

​ 此时需要在成员函数前加上作用域,让定义找到声明的位置就可以使用了

image-20240712000201321

this指针

​ 如下代码,定义了两个对象test1和test2,两个对象分别调用GetNumber,那么编译器怎么分辨是test1调用的该对象还是test2调用的该对象呢🤔

image-20240712002301177

​ 其实是因为C++有一个隐性的指针this获取该对象的地址,并且会放在首个参数的位置,每次调用成员函数都会把对象的地址一起传过去,如下图:

image-20240712005650307

​ this指针在实参和形参处无法显式的写,只能在类里面使用,并且有const修饰,所以this是个指针常量。此外,this指针是一个形参,一般存在栈里面,vs编译器存在ecx寄存器中直接传递。

image-20240712003836473

结尾

​ 以上便是类和对象的基础部分,之后会对默认成员函数进行解析,如果有疑问或者建议都可以私信笔者交流,大家互相学习,互相进步!🌹

相关推荐

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-13 02:46:05       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-13 02:46:05       71 阅读
  3. 在Django里面运行非项目文件

    2024-07-13 02:46:05       58 阅读
  4. Python语言-面向对象

    2024-07-13 02:46:05       69 阅读

热门阅读

  1. 【题解】二分 | [USACO 2009 Dec S]Music Notes

    2024-07-13 02:46:05       20 阅读
  2. 如何在工作中"开悟"?

    2024-07-13 02:46:05       26 阅读
  3. 53.处理cpu的异常

    2024-07-13 02:46:05       22 阅读
  4. 如何在Linux系统下安装Anaconda

    2024-07-13 02:46:05       21 阅读
  5. LeetCode 1351, 1, 208

    2024-07-13 02:46:05       22 阅读
  6. 【C++精华铺】13.STL stack 和 STL queue 模拟实现

    2024-07-13 02:46:05       20 阅读