类和对象(上篇)

面向对象和面向过程

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指针,就可以实现成员函数访问并修改成员变量

相关推荐
树叶@10 分钟前
Python数据分析7
开发语言·python
wydaicls13 分钟前
十一.C++ 类 -- 面向对象思想
开发语言·c++
Biomamba生信基地1 小时前
R语言基础| 下载、安装
开发语言·r语言·生信·医药
姜君竹1 小时前
QT的工程文件.pro文件
开发语言·c++·qt·系统架构
思捻如枫1 小时前
C++数据结构和算法代码模板总结——算法部分
数据结构·c++
奇树谦1 小时前
使用VTK还是OpenGL集成到qt程序里哪个好?
开发语言·qt
VBA63371 小时前
VBA之Word应用第三章第十节:文档Document对象的方法(三)
开发语言
老胖闲聊1 小时前
Python Rio 【图像处理】库简介
开发语言·图像处理·python
码界奇点2 小时前
Python Flask文件处理与异常处理实战指南
开发语言·python·自然语言处理·flask·python3.11
贩卖纯净水.2 小时前
浏览器兼容-polyfill-本地服务-优化
开发语言·前端·javascript