类和对象(上篇)

面向对象和面向过程

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

相关推荐
海南java第二人6 分钟前
SpringBoot启动流程深度解析:从入口到容器就绪的完整机制
java·开发语言
星火开发设计10 分钟前
C++ queue 全面解析与实战指南
java·开发语言·数据结构·c++·学习·知识·队列
橘颂TA16 分钟前
【剑斩OFFER】算法的暴力美学——力扣 394 题:字符串解码
数据结构·c++·结构与算法
DICOM医学影像18 分钟前
2. go语言从零实现以太坊客户端-查询区块链账户余额
开发语言·golang·区块链·以太坊·web3.0·hardhat
Data_agent29 分钟前
Python 编程实战:函数与模块化编程及内置模块探索
开发语言·python
new_zhou29 分钟前
vs2019+qt工程中生成dump文件及调试
开发语言·qt·visual studio·dump调试
栈与堆1 小时前
LeetCode 19 - 删除链表的倒数第N个节点
java·开发语言·数据结构·python·算法·leetcode·链表
一路向北·重庆分伦1 小时前
03-01:MQ常见问题梳理
java·开发语言
txinyu的博客1 小时前
结合游戏场景理解,互斥锁,读写锁,自旋锁,CAS / 原子变量,分段锁
开发语言·c++·游戏
hugerat1 小时前
在AI的帮助下,用C++构造微型http server
linux·c++·人工智能·http·嵌入式·嵌入式linux