类和对象(上篇)

面向对象和面向过程

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

相关推荐
ac-er88882 分钟前
PHP弱类型安全问题
开发语言·安全·php
ac-er88883 分钟前
PHP网络爬虫常见的反爬策略
开发语言·爬虫·php
爱吃喵的鲤鱼13 分钟前
linux进程的状态之环境变量
linux·运维·服务器·开发语言·c++
DARLING Zero two♡39 分钟前
关于我、重生到500年前凭借C语言改变世界科技vlog.16——万字详解指针概念及技巧
c语言·开发语言·科技
7年老菜鸡40 分钟前
策略模式(C++)三分钟读懂
c++·qt·策略模式
Gu Gu Study41 分钟前
【用Java学习数据结构系列】泛型上界与通配符上界
java·开发语言
Ni-Guvara1 小时前
函数对象笔记
c++·算法
似霰1 小时前
安卓智能指针sp、wp、RefBase浅析
android·c++·binder
芊寻(嵌入式)1 小时前
C转C++学习笔记--基础知识摘录总结
开发语言·c++·笔记·学习
獨枭1 小时前
C++ 项目中使用 .dll 和 .def 文件的操作指南
c++