前言
感觉自己的基础还是不够好 最近打算在学新知识的同时 把之前的一些知识点再复习一下
引入
在C语言的学习中 我们学习过结构体 我们用结构体来描述复杂的对象 在结构体中只能定义变量
而在C++的结构体中 我们可以在C++中 定义函数
下面给出一个简单的例子
创建一个结构体 并且包含打印其信息的showinfo函数
struct Stu
{
void showinfo()
{
cout << name << " " << sex << " " << age << endl;
}
char name;
char sex;
int age;
};
并且 在cpp中 还创建了**类(class)**来替代结构体
类
类的模板
给出一个定义类的模板
class ClassName
{
//类体:由成员函数和成员变量组成
};//与结构体类似的是:最后都有分号
解释说明:
class是关键字 ClassName是类的名字
类体中内容称为类的成员:类中的变量称为类的属性或成员变量; 类中的函数称为类的方法或者成员函数。
类的定义
类有两种定义方式
第一种
声明和定义全部放在类体中,
需注意:成员函数如果在类中定义,编译器可能会将其当成内联函数处理。
class Person
{
public:
void showinfo()
{
cout << name << " " << sex << " " << age << endl;
}
public:
string name;
string sex;
int age;
};
第二种
类声明放在.h文件中,成员函数定义放在.cpp文件中,
注意:成员函数名前需要加类名::
一般情况下,更期望采用第二种方式。
在person.h文件中
class Person
{
public:
void showinfo();
public:
string name;
string sex;
int age;
};
在person.cpp文件中
#include"person.h"
void Person::showinfo()
{
cout << name << " " << sex << " " << age << endl;
}
类的访问限定符及封装
访问限定符
访问限定符,顾名思义 访问类的对象是受限制的
补充说明
- public修饰的成员在类外可以直接被访问
- protected和private修饰的成员在类外不能直接被访问
- 访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现为止
- 如果后面没有访问限定符就直到类结束
- class的默认访问权限是private 、struct则为public
- 访问限定符只在编译时有用 当数据映射到内存后 访问限定符之间没有任何区别
封装
不做过多介绍 直接来看下面的八股文
封装:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行交互。
封装本质上是一种管理,让用户更方便使用类。
比如:对于电脑这样一个复杂的设备,提供给用户的就只有开关机键、通过键盘输入,显示器,USB插孔等,让用户和计算机进行交互,完成日常事务。但实际上电脑真正工作的却是CPU、显卡、内存等一些硬件元件。
对于计算机使用者而言,不用关心内部核心部件,比如主板上线路是如何布局的,CPU内部是如何设计的等,用户只需要知道,怎么开机、怎么通过键盘和鼠标与计算机进行交互即可。因此计算机厂商在出厂时,在外部套上壳子,将内部实现细节隐藏起来,仅仅对外提供开关机、鼠标以及键盘插孔等,让用户可以与计算机进行交互即可。
在C++语言中实现封装,可以通过类将数据以及操作数据的方法进行有机结合,通过访问权限来隐藏对象内部实现细节,控制哪些方法可以在类外部直接被使用。
类的作用域
类定义了一个新的作用域 类中所有成员都在类的作用域中 在类体外定义成员时,需要使用**:😗*(作用域操作符)来指明成员属于哪个类域
通俗来讲就是 出门在外 一个人(成员)是一个家庭(类域)中的一员 自我介绍的时候用::来介绍自己是谁家的
下面给出一段例子
class Person
{
public:
void PrintPersoninfo();
private:
string name;
string gender;
int age;
};
//这里要指定PrintPersonInfo属于Person这个类域
void Person::PrintPersoninfo()
{
cout << name << endl << gender << endl << age << endl;
}
类的实例化
用类类型创建对象的过程,称为类的实例化
再来看一段八股文
- 类是对对象进行描述的,是一个模型一样的东西,限定了类有哪些成员,定义出一个类并没有分配实际的内存空间来存储它;
比如:入学时填写的学生信息表,表格就可以看成是一个类,来描述具体学生信息。
类就像谜语一样,对谜底来进行描述,谜底就是谜语的一个实例。
谜语:“年纪不大,胡子一把,主人来了,就喊妈妈” 谜底:山羊 - 一个类可以实例化出多个对象,实例化出的对象 占用实际的物理空间,存储类成员变量
可以看下面这个例子:
int main()
{
Person.age = 100;//会报错:编译失败:error C2059: 语法错误:“.”
return 0;
}
Person类是没有空间的,只有Person类实例化出的对象才有具体的年龄。
- 做个比方。类实例化出对象就像现实中使用建筑设计图建造出房子,类就像是设计图,只设计出需要什么东西,但是并没有实体的建筑存在,同样类也只是一个设计,实例化出的对象才能实际存储数据,占用物理空间
类对象模型
计算类对象的大小
(了解即可
//类中既有成员变量又有成员函数
class A1
{
public:
void PrintA()
{
count << a << endl;
}
private:
char a;
}
//类中仅有成员函数
class A2
{
public:
void f(){};
}
//类体为空:空类
class A3
{}
大家可以先猜想一下 类对象是如何存储的呢
A:
存储类中的各个成员
B:
代码只保存一份,在对象中保存存放代码的地址
C:
只保存成员变量, 成员函数存放在公共的代码段
直接给出结论:
一个类的大小:就是这个类中成员变量之和 要注意内存对齐
特别的:对于空类 编译器给空类一个字节来唯一标识这个类的对象
说到内存对齐,我们可以联想到结构体的内存对齐规则
大家可以自行了解一下(绝对不是我懒得打字了
结语
关于类与对象的学习 先暂时到这里 我们下篇文章见~~~~
希望你有所收获