初识类

317 阅读3分钟

「这是我参与2022首次更文挑战的第12天,活动详情查看:2022首次更文挑战

一、初步认识面向过程和面向对象

C 语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。

C++ 是基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完成。

注意 C++ 并不是纯面向对象的语言,在前面就说过 C++ 的产生是为了更好的 C,所以 C++ 既有面向过程也有面向对象,可以混合编程

二、类的引入

❓ C和C++中使用结构体 ❔

//C++兼容C结构体的语法
struct ListNodeC
{
	int val;
	struct ListNodeC* next;
};
//C++同时也支持这种语法
struct ListNodeCpp
{
	int val;
	ListNodeCpp* next;
};
int main()
{
	struct ListNodeC n1;
	ListNodeCpp n2;
	return 0;
}

分析:上述代码如果换成 C 的编译器就会报错,因为 struct ListNodeCpp 组合在一起才是一个类型;而 C++ 支持 ListNodeCpp n2 的原因是 struct 已经升级成类了,这个类就可以定义类型。

C 语言面向过程 —— 数据和方法是分离的

C++ 面向对象 —— 数据和方法是封装在一起的

struct Student
{
	//方法
	void SetStudentInfo(const char* name, const char* gender, int age)
	{
		strcpy(_name, name);
		strcpy(_gender, gender);
		_age = age;
	}
	void PrintStudentInfo()
	{
		cout<<_name<<" "<<_gender<<" "<<_age<<endl;
	}
	//数据
	char _name[20];
	char _gender[3];
	int _age;
};

int main()
{
	Student s;
	s.SetStudentInfo("Peter", "男", 18);
	s.PrintStudentInfo();
	return 0;
}

注意 struct 可以定义类,但在 C++ 中更喜欢用 class 来代替 struct。

❗ 对比结构体/类实现栈 ❕

#include<iostream>
using namespace std;
namespace bitc
{
	struct Stack
	{
		int* a;
		int top;
		int capacity;
	};
	void StackInit(struct Stack* ps){}
	void StackPush(struct Stack* ps, int x){}
	//...
}
namespace bitcpp
{
	class Stack
	{
	public:
		void Init(){}
		void Push(int x){}
	private:
		int* a;
		int top;
		int capacity;
	};	
}
int main()
{
	struct bitc::Stack stc;
	bitc::StackInit(&stc);
	bitc::StackPush(&stc, 1);
	bitc::StackPush(&stc, 2);
	
	bitcpp::Stack stcpp;
	stcpp.Init();
	stcpp.Push(1);
	stcpp.Push(2);
	
	return 0;
} 

1️⃣ 对于程序的可读性来说:使用类可以把内部的 Stack 省略;但是使用结构体不能省略

2️⃣ 类实现的内部的方法比结构体实现的少一个参数,这个先放着,因为它跟下面的 this 指针有关系

3️⃣ class Stack 和 struct Stack 会命名冲突 (C++ 认为它俩都是类),所以这里使用命名空间解决

4️⃣ 上面这个程序的 bitcpp 域里的 Stack 类里有个 public,这里就牵扯出 C++ 的一个新概念 —— 类的访问限定符

三、类的定义

class className	
{
	//类体:由成员函数和成员变量组成
}; //注意后面的分号

📝 说明:class 为定义类的关键字,ClassName 为类的名字,{} 中为类的主体,注意类定义结束时后面分号。类中的元素称为类的成员:类中的数据称为类的属性或者成员变量; 类中的函数称为类的方法或者成员函数。

#include"person.h"
//显示基本信息,实现:输出名字、性别、年龄
void Person::showinfo()
{
	cout<<_name<<"-"<<_sex<<_age<<endl;
}

❗ 类的两种定义方式 ❕

1、声明和定义全部放在类体中,需要注意:成员函数如果在类中定义,编译器可能会将其当成内联函数处理 (一般是短小的定义)。

规范是把短小的成员函数直接在类里定义,也就是直接 inline;长的函数,声明和定义分离

在这里插入图片描述

2、 声明放在 .h 文件中,类的定义放在 .cpp 文件中 在这里插入图片描述

💨注意,一般情况下,更期望采用第二种方式。