「这是我参与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 文件中
💨注意,一般情况下,更期望采用第二种方式。