类和对象(上篇)

面向对象和面向过程

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

类的引入

在C语言中,struct结构体中只可以存放成员变量,但是到了C++中struct中不仅可以存放成员变量,还可以定义函数。

cpp 复制代码
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>

using namespace std;

struct Student
{
	void ShowStudentInfo()
	{
		cout << _name << " " << _age << " " << _gender << " " << _IDnumber << endl;
	}

	void SetStudentInfo(const char* name="张三",const int age = 18,const char* gender="男",const char* ID="19801001")
	{
		strcpy(_name, name);
		_age = age;
		strcpy(_gender, gender);
		strcpy(_IDnumber, ID);
	}

	char _name[20];//姓名
	int _age;//年龄
	char _gender[3];//性别
	char _IDnumber[20];//学号
};

int main()
{
	Student st;
	st.SetStudentInfo();
	st.ShowStudentInfo();
	return 0;
}

我们可以通过struct调用内部的函数来控制struct中的成员变量,甚至打印出来

类的定义

现在来讲如何定义一个类:

cpp 复制代码
class class_name
{
	//成员
};//和struct一样,需要分号;

class为定义类的关键字,class_name是类的名字,大括号{ }内部为类体,里边可以定义成员函数,成员变量,注意大括号后边要以分号结尾。类体中的数据称为成员变量,类体中的函数称为成员函数

成员函数可以先在类体中声明,随后在类外进行定义

cpp 复制代码
class person
{
public:
	void ShowInfo();

public:
	int age;
	char name[20];
};

void person::ShowInfo()
{
	cout << name << " " << age << endl;
}

在类外定义成员函数,需要加上class_name:: 表示实在该类中的成员函数

访问限定符

访问限定符一共有三个:public , private,protected

① public修饰的成员在类外可以直接被访问(一般对外开放的成员函数放到其中)

② protected和private修饰的成员在类外不能直接被访问(此处protected和private是类似的)(一般成员变量,不希望外界直接可以访问,放到private中)

③ 访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止

④ class的默认访问权限为private,struct为public(因为struct要兼容C)

类的作用域

与类外定义成员函数一样,如果需要在外部定义成员函数,需要使用作用域解析符::来指明是哪个类的成员

cpp 复制代码
class person
{
public:
	void ShowInfo();

public:
	int age;
	char name[20];
};

void person::ShowInfo()
{
	cout << name << " " << age << endl;
}

类的实例化

类的实例化:用类来创建对象的过程叫做类的实例化,定义一个类是不需要分配内存空间的,只有当我们实例化的时候才会进行分配空间,一个类可以同时创建多个对象

cpp 复制代码
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>

using namespace std;

class person
{
public:

	void SetInfo(const char*name="John",const int age = 20)
	{
		strcpy(_name, name);
		_age = age;
	}
	void ShowInfo()
	{
		cout << _name << " " << _age << endl;
	}

public:
	int _age;
	char _name[20];
};

int main()
{
	person John;
	John.SetInfo();
	John.ShowInfo();
	return 0;
}

this指针

提问:为什么成员函数可以直接访问成员变量呢,既没有进行传参,成员函数也不是全局变量

这是为什么呢

答:是因为,成员函数的参数中有一个隐藏的参数

cpp 复制代码
class Date
{
public:
	void SetDate(int year,int month,int day)
	{
		_year = year;
		_month = month;
		_day = day;
	}

	void ShowDate()
	{
		cout << _year << "-" << _month << "-" << _day << endl;
	}

private:
	int _year;
	int _month;
	int _day;
};

int main()
{
	Date d1;
	d1.SetDate(2024, 5, 7);
	d1.ShowDate();
	return 0;
}

为什么成员函数ShowDate直接可以读取到_year等成员的值呢,

cpp 复制代码
void ShowDate()
{
	cout << _year << "-" << _month << "-" << _day << endl;
}

void ShowDate(Date* this)
{
	cout << this->_year << this->_month << this->_day << endl;
}

实际上上边的写法是第二种隐藏掉了this指针,

this指针的类型属于const*(指向不可改变,指向的内容可以修改),并且只在成员内部使用

通过隐式传参this指针,就可以实现成员函数访问并修改成员变量

相关推荐
云栖梦泽2 分钟前
鸿蒙应用签名与上架全流程:从开发完成到用户手中
开发语言·鸿蒙系统
爱上妖精的尾巴40 分钟前
6-4 WPS JS宏 不重复随机取值应用
开发语言·前端·javascript
小鸡吃米…2 小时前
Python 列表
开发语言·python
kaikaile19952 小时前
基于C#实现一维码和二维码打印程序
开发语言·c#
我不是程序猿儿3 小时前
【C#】画图控件的FormsPlot中的Refresh功能调用消耗时间不一致缘由
开发语言·c#
rit84324993 小时前
C# Socket 聊天室(含文件传输)
服务器·开发语言·c#
kk哥88993 小时前
C++ 对象 核心介绍
java·jvm·c++
helloworddm3 小时前
WinUI3 主线程不要执行耗时操作的原因
c++
嘉琪0013 小时前
Vue3+JS 高级前端面试题
开发语言·前端·javascript
xunyan62343 小时前
面向对象(下)-接口的理解
java·开发语言