【c++师傅领进门,修行靠个人】第三篇:类和对象

什么?你告诉我你还没对象?那还等什么,还不跟我一起new一个。

在这里插入图片描述

1 别急,先来了解你的对象

C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。
C++是基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完成

举个洗衣服的栗子:
如果是面向过程:1.打开洗衣机 2.把洗衣液和衣服放进洗衣机 3.选择模式 4.启动洗衣机
如果是面向对象:我们只需要调用洗衣机这个对象即可完成,洗衣机具体是怎么实现洗衣服过程的我们不必关心。

因为从打开洗衣机到启动洗衣机的整个流程都是对洗衣机的操作,是洗衣机的行为。洗衣机就是一个对象,所以只要操作洗衣机所具备的功能,都要定义在洗衣机中。

面向对象的概念:

1.面向对象是思考问题的一种思考方式,是一种思想。比如:概念与实例。理论与实践。名和实等等。。
2.类就是一类对象的统称。对象就是这一类具体化的一个实例。
3.面向对象的好处:将复杂的事情变简单了,只要面对一个对象就行。

面向对象设计:

面向对象设计把握一个重要的经验:谁拥有数据,谁对外提供操作这些数据(私有)的方法! (被动的一方是数据的拥有者,主动的一方是执行者)
开发时:找对象,建对象,用对象,并维护对象之间的关系。
总之,面向对象就是用代码(类)来描述客观世界的事物的一种方式. 一个类主要包含一个事物的属性和行为

在这里插入图片描述

2 类之初体验

C语言中,结构体中只能定义变量,在C++中,结构体内不仅可以定义变量,也可以定义函数。

class className
{
    
    
      // 类体:由成员函数和成员变量组成
 
};     // 一定要注意后面的分号

class为定义类的关键字,ClassName为类的名字,{}中为类的主体,注意类定义结束时后面分号。类中的元素称为类的成员:类中的数据称为类的属性或者成员变量; 类中的函数称为类的方法或者成员函数。类的两种定义方式:

  1. 声明和定义全部放在类体中,需要注意:成员函数如果在类中定义,编译器可能会将其当成内联函数处理
#include <iostream>

using namespace std;

class Person
{
    
    
public:
	void show()
	{
    
    
		cout << "成员函数" << endl;
	}
private:
	int _age;
	char* _name;
	char* _sex;
};
  1. 声明放在.h文件中,类的定义放在.cpp文件中
    在这里插入图片描述
    一般情况下,更期望采用第二种方式。

2.1 类的访问限定符

【访问限定符说明】

  1. public修饰的成员在类外可以直接被访问
  2. protected和private修饰的成员在类外不能直接被访问(此处protected和private是类似的)
  3. 访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止
  4. class的默认访问权限为private,struct为public(因为struct要兼容C)

注意:访问限定符只在编译时有用,当数据映射到内存后,没有任何访问限定符上的区别

2.2 认识封装

C++实现封装的方式:用类将对象的属性与方法结合在一块,让对象更加完善,通过访问权限选择性的将其接口提供给外部的用户使用。

封装将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行交互。

封装本质上是一种管理:我们如何管理兵马俑呢?比如如果什么都不管,兵马俑就被随意破坏了。那么我们首先建了一座房子把兵马俑给封装起来。但是我们目的全封装起来,不让别人看。所以我们开放了售票通道,可以买票突破封装在合理的监管机制下进去参观。类也是一样,我们使用类数据和方法都封装到一下。不想给别人看到的,我们使用protected/private把成员封装起来。开放一些共有的成员函数对成员合理的访问。所以封装本质是一种管理。

2.3 类的作用域

类定义了一个新的作用域,类的所有成员都在类的作用域中。在类体外定义成员,需要使用 :: 作用域解析符指明成员属于哪个类域。

class Person
{
    
    
public:
	void show();
private:
	int _age;
	char* _name;
	char* _sex;
};

//在类外定义类内的函数要加作用域解析符
void Person::show()
{
    
    
	cout << "成员函数" << endl;
}

3 来了,请创建你的对象

在这里插入图片描述

用类类型创建对象的过程,称为类的实例化

  1. 类只是一个模型一样的东西,限定了类有哪些成员,定义出一个类并没有分配实际的内存空间来存储它
  2. 一个类可以实例化出多个对象,实例化出的对象 占用实际的物理空间,存储类成员变量
  3. 做个比方。类实例化出对象就像现实中使用建筑设计图建造出房子,类就像是设计图,只设计出需要什么东西,但是并没有实体的建筑存在,同样类也只是一个设计,实例化出的对象才能实际存储数据,占用物理空间

在这里插入图片描述

class Person
{
    
    
public:
	void show()
	{
    
    
		cout << "对象" << endl;
	}

private:
	int _age;
	char* _name;
	char* _sex;
};


int main()
{
    
    
	Person p; //创建了一个对象p
	p.show(); //对象可以调用类里面的成员

	return 0;
}

在这里插入图片描述

4.类对象模型

对象只保存成员变量,成员函数存放在公共的代码段
在这里插入图片描述在这里插入图片描述

5 this指针

在这里插入图片描述

  1. this指针的类型:类类型* const
  2. 只能在“成员函数”的内部使用
  3. this指针本质上其实是一个成员函数的形参,是对象调用成员函数时,将对象地址作为实参传递给this形参。所以对象中不存储this指针。
  4. this指针是成员函数第一个隐含的指针形参,一般情况由编译器通过ecx寄存器自动传递,不需要用户传递

我们来看下面一段代码了解this指针:

class Person
{
    
    
public:
	void Display()
	{
    
    
		cout << _age << endl;
	}

private:
	int _age;
	char* _name;
	char* _sex;
};

void Display()函数看似没有形参,但是其实传了this*指针来,以便访问类内成员变量,编译器会处理隐含的this指针

void Display(Person* this)
	{
    
    
		cout << this->_age << endl;
	}

好了,本文就总结到这,相信你对面向对象和类都有了基本的认识,后面会还会继续详细介绍。各位看官如果觉得文章写的可以,不妨点个赞再走,如果想一起交流学习经验,不妨点个关注。

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_42907822/article/details/117826863
今日推荐