类和对象(上篇)

面向对象和面向过程

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

相关推荐
天远Date Lab6 小时前
天远企业司法认证API实战:Python构建企业级供应链合规审查防火墙
大数据·开发语言·网络·python
fqbqrr6 小时前
2603C++,简单实现协程
c++
进击的编程浪人6 小时前
c/c++输入方法及对比
c语言·c++·c#
蓝天智能6 小时前
QT实战:Qt6 编码规范模板
开发语言·qt
载数而行5206 小时前
QT前置2 可视化文件,QRC文件两种处理
c++·qt·学习
水痕016 小时前
go语言里面使用elasticsearch
开发语言·elasticsearch·golang
小邓的技术笔记6 小时前
C# 异步编程深水区:Task、ValueTask、线程池饥饿与背压设计
开发语言·c#
马士兵教育6 小时前
AI大模型的未来职业发展方向!
开发语言·人工智能·面试·职场和发展
阿蒙Amon6 小时前
C#常用类库-详解Dapper
开发语言·c#
不会写DN7 小时前
golang的fs除了定权限还能干什么?
开发语言·爬虫·golang