类(Class)是一种用户自定义的数据类型。
文章目录:
前言
通过打比方和代码块,来详细的说明 C++的类及其相关知识
一、面向过程和面向对象初步认识
- 什么是面向过程:
关注完成一件事的具体步骤,就好比洗衣服的过程:

- 什么是面向对象:
关注完成一件事情的参与对象,参与对象之间的联系,在洗衣服中

二、类的引入
在C语言中,结构体只能定义变量,它不能定义函数,而C++中的结构体不仅可以定义变量,还可以定义函数
代码如下(示例):
cpp
#pragma once
#include<iostream>
using namespace std;
struct stack
{
//成员函数
void Init(int defaultcapacity = 4)
{
a = (int*)malloc(sizeof(int) * capacity);
if (a == nullptr)
{
perror("malloc fail");
exit(1);
}
capacity = defaultcapacity;
top = 0;
}
void push(int x)
{
if (top == capacity)
{
int* tmp = (int*)realloc(a, sizeof(int) * 2 * capacity);
if (tmp == nullptr)
{
perror("malloc fail");
exit(1);
}
a = tmp;
capacity *= 2;
}
a[top++] = x;
}
void Destory()
{
free(a);
a = nullptr;
top = capacity;
}
//成员变量
int* a;
int top;
int capacity;
};
而在C语言中定义函数:

而C++中不用struct而用class代替struct ,但C语言和C++也有不同和相同
- 不同:
C++需要兼容C语言,所以C++中struct可以当成结构体使用。另外C++中struct还可以用来
定义类。和class定义类是一样的,区别是struct定义的类默认访问权限是public,class定义的类
默认访问权限是private。class和public等等后序给大家介绍。class可以定义函数,而struct的不行
- 相同:
都是一种用户自定义的数据类型,都可以定义变量
三、类的定义
3.1类是什么?
类(class)是一种用户自定义的数据类型。它将数据和操作数据的函数封装在一起,可以看作是一个模板或蓝图。
可以把类比作是一个建造房子的图纸(模板)。在这张图纸上,规定了房子的布局,比如要有客厅、卧室、厨房这些房间(相当于类中的数据成员),以及在这些房间能进行的活动,像客厅可以看电视、卧室可以睡觉这些(相当于类中的成员函数)。当我们依据这个图纸去建造实际的房子时,就相当于根据类创建对象,每个具体的建造出来的房子就是该类的一个对象,它们都有图纸规定的这些房间和功能,但可能在一些细节上有所不同,比如装修风格等(相当于不同对象的数据成员可能存储不同数据)
3.2类的定义
cpp
class className
{
// 类体:由成员函数和成员变量组成
}; // 一定要注意后面的分号
class为定义类的关键字,ClassName为类的名字,{}中为类的主体,注意类定义结束时后面分
号不能省略。
类体中内容称为类的成员:类中的变量称为类的属性或成员变量; 类中的函数称为类的方法或者成员函数。
类的两种定义方式:
- 声明和定义全部放在类体中
cpp
#include<iostream>
using namespace std;
//成员函数
struct person
{
public:
void print()
{
cout << name << sex << age << endl;
}
char name;
char sex;
int age;
};
- 类声明放在.h文件中,成员函数定义放在.cpp文件中
错误示例:
cpp
.h:
using namespace std;
class person
{
public:
// 成员函数
void print();
//成员变量
char* name;
char* sex;
int age;
};
cpp
.cpp:
void print()
{
cout << name << sex << age << endl;
}

成员函数名前需要加类名::
cpp
void person::print()
{
cout << name << sex << age << endl;
}
四、类的访问限定符和封装
4.1类的访问限定符

- public修饰的成员在类外可以直接被访问
- protected和private修饰的成员在类外不能直接被访问(此处protected和private是类似的)
- 访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止
cpp
class person
{
public:
// 成员函数
void print();
//成员变量
private:
char* name;
char* sex;
int age;
};
- 如果后面没有访问限定符,作用域就到}即---类结束
- class的默认访问权限为private,struct为public(因为struct要兼容C)
4.2封装
什么是封装?
封装:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行交互。
比如:对于电脑这样一个复杂的设备,提供给用户的就只有开关机键、通过键盘输入,显示器,USB插孔等,让用户完成日常事务。但实际上电脑真正工作的却是CPU、显卡、内存等。对于使用者而言,不用关心内部核心部件用户只需要知道,怎么开机、怎么通过键盘和鼠标与计算机进行交互即可。因此计算机厂商在出厂时,在外部套上壳子,将内部实现细节隐藏起来,仅仅对外提供开关机、鼠标以及键盘插孔等,让用户可以与计算机进行交互即可。
五、类和对象的关系
类与对象是一种抽象与实例的关系。
- 类是对象的抽象描述
类就像是一个模板或者蓝图。它定义了一类事物(对象)应该具有的属性(数据成员)和行为(成员函数)
- 对象是类的具体实例
对象是根据类创建出来的具体实体。它是类的一种实例化。
可以把类看作是一个模具,而对象就是用这个模具生产出来的产品。模具(类)决定了产品的形状(属性)和功能(行为),而产品(对象)是实实在在存在的个体,它们都具有模具所定义的特征,但每个产品的具体细节(如颜色、尺寸等属性的具体值)可能有所不同。


这里的 man 就好比依据图纸造出的房子是个实体,是有内存的,而Person就相当于建造房子的图纸
六、类对象模型
6.1如何计算类对象的大小
cpp
#pragma once
#include <iostream>
using namespace std;
class a
{
public:
void print()
{
cout << ch << endl;
}
private:
char ch;
};
cpp
#include "标头.h"
int main()
{
cout << sizeof(a) << endl;
return 0;
}
运行结果:

这是为什么呢?
每个根据相同的类,就好比喻,图纸创建出了不同对象中在每个对象中成员变量是不同的,而成员函数几乎是相同的,都在做相同的事,成员变量就好比寝室里的每个人的床,而成员函数就好比洗水池,不需要每个人都有一个洗水池,只需要创建一个洗水池即可,成员变量创建一次成员,函数创建一次,每个对象都保存了一份相同的代码,也就是成员函数的代码相同,代码保存多次会浪费空间,所以计算类的大小时只需在乎成员变量,不用在乎成员函数
cpp
#include "stack.h"
int main()
{
person a1;
person a2;
person a3;
return 0;
}
他们的成员函数都用同一个,也就是把类成员的函数表放在了公共代码区
看这段代码:
cpp
#pragma once
#include <iostream>
using namespace std;
class a
{
public:
void print()
{
cout << ch << endl;
}
private:
char ch;
};
cpp
#include "标头.h"
int main()
{
a a1;
cout << sizeof(a) << endl;
cout << sizeof(a1) << endl;
return 0;
}
运行结果:

这就好比拿着一张房子的设计图算,房子面积多大,何去实地计算房子的面积一样,结果肯定是一样的
看这段代码:
cpp
#include "标头.h"
int main()
{
a a1;
a a2;
cout << sizeof(a) << endl;
cout << sizeof(a1) << endl;
a1.ch = 1;
a1.print();
return 0;
}
a1.ch是去对象的空间中找,然后赋值,而a1.print是去公共区域中找,而不是去对象空间里找
看这段代码:
cpp
#pragma once
#include <iostream>
using namespace std;
class a
{
public:
void print()
{
cout << ch << endl;
}
//private:
char ch;
int num;
};
cpp
#include "标头.h"
int main()
{
a a1;
cout << sizeof(a) << endl;
cout << sizeof(a1) << endl;
return 0;
}
运行结果:

这就和C语言一样,C语言中结构体的大小是有内存对齐规则的,而C++中class的也一样
内存对齐规则:
- 第一个成员在与结构体偏移量为0的地址处。
- 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。
注意:对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值。
VS中默认的对齐数为8 - 结构体总大小为:最大对齐数(所有变量类型最大者与默认对齐参数取最小)的整数倍。
- 如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。
具体可以看我写的C语言结构体:隐藏在代码中的"魔法盒"_二十七步天注定逆流河上任我行什么意思-CSDN博客
看这段代码:
cpp
#pragma once
#include <iostream>
using namespace std;
class a
{
public:
void print()
{
cout << ch << endl;
}
//private:
char ch;
int num;
};
class b//类中仅有成员函数
{
public:
void Swap()
{ }
};
class c//类中什么都没有(空类)
{
};
cpp
#include "标头.h"
int main()
{
a a1;
b b1;
c c1;
cout << sizeof(a1) << endl;
cout << sizeof(b1) << endl;
cout << sizeof(c1) << endl;
return 0;
}
运行结果:

虽然说成员函数它在公共代码区域,但是它为什么size of大小为 1 呢?
为了占一个位子,表示对象存在
总结
首先,初步认识了一下C++的面向对象和C语言的面向过程,然后从C语言的结构体中引入C++的类,然后再 从类是什么? 和类的定义来解释C++的类,同时补充了类的限定符的知识以及封装的形象说明,之后用打比方的方式形象的说明类和对象的关系,最后,通过代码块来说明如何计算类的对象的大小