【C++入门第四期】类和对象 ( 上 )

  • 前言
  • 类的使用
  • 类的定义
    • 类的两种定义方式:
    • 成员变量名的定义建议
  • 类的访问限定符
  • 类的作用域
  • 类的实列化
  • 如何计算类的大小
    • 结构体内存对齐规则
  • this指针
    • this指针的特性

前言

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

C++是面向对象的语言,面向对象的三大特性:继承 ,封装 ,多态。但由于是入门文章,一开始就说把这些解释清楚未免太难为大家了。
请添加图片描述

大家先把类理解为:功能接口及数据包,需要那个功能直接调用其接口即可获得结果

使用接口时可以不知道的的具体实现,我们只需知道他的功能即可

类的使用

先别管实现,咱先看看猪跑(类的使用)

#include<iostream>
#include<string.h>

struct student//学生类
{
	student(const char* number ,const char* name)
	{
		strcpy(_number, number);
		strcpy(_name, name);
	}
	void print()
	{
		printf("姓名:%s  学号:%s\n", _name, _number);
	}
	char* number()
	{
		return _number;
	}
	char* name()
	{
		return _name;
	}
	char _number[15];
	char _name[15];
};
int main()
{
//类型为student ,对象名为zhang_san,()中是传参
	student zhang_san("20013", "张三");
	student li_si("20015", "李四");

	zhang_san.print();// .直接调用print接口即可
	//获取li_si对象中的_name变量中的数据
	std::cout << li_si._name << std::endl;
}

如上我定义了 student 类,里面有打印出学生信息的功能,及学生学号(_number)学生姓名(_name)

使用时我们只需定义 student对象即可使用 student 中的功能 , 及获取类中的变量数据
在这里插入图片描述
但是上面结构体的定义,在C++中更喜欢用class来代替

类的定义

class className
{
	//类体:由成员变量和成员函数组成

};  //注意后面要加分号结束

class为定义类的关键字,ClassName为类的名字,{}中为类的主体,注意类定义结束时后面分
号不能省略。

类体中内容称为类的成员:类中的变量称为类的属性或成员变量; 类中的函数称为类的方法或者成员函数。

类的两种定义方式:

  1. 成员函数声明和定义全部放在类体中
    需注意:成员函数如果在类中定义,编译器可能会将其当成内联函数处理。
    在这里插入图片描述
    2. 类声明放在.h文件中,成员函数定义放在.cpp文件中

    注意:成员函数名定义前需要加类名:: ,表示该函数属于该类
    在这里插入图片描述
    一般情况下,更期望采用第二种方式

成员变量名的定义建议

在这里插入图片描述

类的访问限定符

C++实现封装的方式:用类将对象的属性与方法结合在一块,让对象更加完善,并通过访问权限选择性的将其接口提供给外部的用户使用

在这里插入图片描述
访问限定符说明

  1. public修饰的成员在类外可以直接被访问
  2. protected和private修饰的成员在类外不能直接被访问(此处protected和private是类似的),等写继承的时候再说这俩有啥区别,说太多怕大家迷糊

访问权限作用域

  1. 从该访问限定符出现的位置开始直到下一个访问限定符出现时为止
  2. 如果后面没有访问限定符,作用域就到 } 即类结束
    在这里插入图片描述
    如果类中没有写访问限定符
    class的默认访问权限为private,struct为public(因为struct要兼容C)

类的作用域

由于类创建了作用域,类的所有成员都在类的作用域中。在类体外定义类的成员时,需要使用 ::
作用域操作符指明成员属于哪个类域

void car::print()//car::声明print()属于类car这个作用域
{
	cout << _name << _price << endl;
}
class car
{
public:
	void print();//声明
private:
	char _name[20] ;//车名
	char _price[20];//价格
};

类的实列化

类是对对象进行描述的,是一个模型一样的东西,限定了类有哪些成员,定义出一个类并没
有分配实际的内存空间来存储它;比如:4s店车入库时填写的表格,表格就可以看成是一个类,来描述车辆信息。

打个比方:类就像是建筑设计图(图只是一个构想或一个计划是虚拟的),并且我们可以用该图纸建造出多个一样实际的建筑。

类也一样在没生成对象前,他的功能是无法使用的,需要实列化出对象才行。

如下图,类需要定义出对象才能使用,用类类型创建对象的过程,称为类的实例化

class car
{
public:
	void print();

	char _name[20] ;//车名
	char _price[20];//价格
};
void car::print()//car::声明print()属于类car
{
	cout << "车名:" << _name << " 价格:" << _price << endl;
}
int main()
{
	//car.print();//会报错,类是不能直接使用的
	
	//正确方法
	car Byd_q;//定义出对象Byd_q 
	strcpy(Byd_q._name, "比亚迪秦");//向对象中写入数据
	strcpy(Byd_q._price, "99800");//向对象中写入数据
	Byd_q.print();//调用对象的成员含函数
}

如何定义对象

类名 对象名;

如何计算类的大小

class A1
{
public:
	void fun()
	{
		cout << "zhu_ge_bin";
	}
	int _a;
};
class A2
{
public:
	int _a;
};
class A3
{
public:

};
int main()
{
	A1 d1;
	A2 d2;
	A3 d3;
	printf("A1对象的大小为:%d\n", sizeof(d1));
	printf("A2对象的大小为:%d\n", sizeof(d2));
	printf("A3对象的大小为:%d\n", sizeof(d3));
}

如上图运行结果为
在这里插入图片描述
可以看出一个类的大小,实际就是该类中”成员变量”之和,当然要注意内存对齐

注意:空类的大小,空类比较特殊,编译器给了空类一个字节来唯一标识这个类的对象

这里可能有人要问了那类中的函数不占空间吗?

1:每个对象所占用的存储空间只是该对象的数据部分所占用的存储空间,而不包括函数代码所占用的存储空间。(后面还会学虚基类指针和虚函数指针也属于数据部分现在可以暂时不用管)
2:类的成员函数本身不占用对象的内存空间。它们只是类的一部分,存储在代码段中。
3:因此,不同对象共享相同的函数代码,从而节省了内存空间。

结构体内存对齐规则

结构体内存对齐规则

  1. 第一个成员在结构体偏移量为0的地址处。
  2. 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。
    注意:对齐数 = 编译器默认的对齐数 与 该成员大小两者之间的较小值,VS中默认的对齐数为8
  3. 结构体总大小为:最大对齐数(所有变量类型最大者与默认对齐参数取最小)的整数倍。
  4. 如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整
    体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。

this指针

首先看以下代码,并运行

class car
{
public:
	void print()
	{
		cout << "车名:" << _name << " 价格:" << _price << endl;
	}
	void Init(const char* name , const char* price)
	{
		strcpy(_name , name);//写入数据
		strcpy(_price , price);//写入数据
	}
private:
	char _name[20];//车名
	char _price[20];//价格
};
void test4()
{
	car Byd_q;//定义出对象Byd_q
	car Byd_s;//定义出对象Byd_s
	Byd_q.Init("比亚迪 秦" , "99800");//向对象中写入数据
	Byd_s.Init("比亚迪 宋" , "154800");//向对象中写入数据

	Byd_q.print();//调用对象的打印函数
	Byd_s.print();//调用对象的打印函数
}

结果如下
在这里插入图片描述
上面说了对象只有数据,而类的函数是共用的。那为啥类的不同对象调用同一个函数会有不一样的结果(注意:要保证对象中的数据不一样)

C++中通过引入this指针解决该问题,即:C++编译器给每个“非静态的成员函数“增加了一个隐藏
的指针参数,让该指针指向当前对象(函数运行时调用该函数的对象),在函数体中所有“成员变量”
的操作,都是通过该指针去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编
译器自动完成。
上述代码调用成员函数传参时,看似只传入了一些基本数据,实际上还传入了指向该对象的指针:
在这里插入图片描述

this指针的特性

  1. this指针的类型:类类型* const,即成员函数中,不能给this指针赋值。
  2. 只能在“成员函数”的内部使用
  3. this指针本质上是“成员函数”的形参,当对象调用成员函数时,将对象地址作为实参传递给
    this形参。所以对象中不存储this指针。
  4. this指针是“成员函数”第一个隐含的指针形参,一般情况由编译器通过ecx寄存器自动传
    递,不需要用户传递

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/15929.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2.2 定点加法 减法运算

学习前的建议 以下是一些学习定点加法和减法运算的建议&#xff1a; 掌握定点数的表示方法&#xff1a;在进行定点加法和减法运算之前&#xff0c;需要先了解定点数的表示方法&#xff0c;包括定点数的位数、小数点位置以及符号位等信息。 理解定点加法和减法的原理&#xf…

五、C++内存管理机制 —— primitives(侯捷)

侯捷 C八部曲笔记汇总 - - - 持续更新 ! ! ! 一、C 面向对象高级开发 1、C面向对象高级编程(上) 2、C面向对象高级编程(下) 二、STL 标准库和泛型编程 1、分配器、序列式容器 2、关联式容器 3、迭代器、 算法、仿函数 4、适配器、补充 三、C 设计模式 四、C 新标准 五、C 内存管…

微服务---分布式事务Seata(XA,AT,TCC,SAGA模式基本使用)

分布式事务 1.分布式事务问题 1.1.本地事务 本地事务&#xff0c;也就是传统的单机事务。在传统数据库事务中&#xff0c;必须要满足四个原则&#xff1a; 1.2.分布式事务 分布式事务&#xff0c;就是指不是在单个服务或单个数据库架构下&#xff0c;产生的事务&#xff0c…

2023牛客五一集训派对day2部分题解

D Duration DDuration 题目大意 给你两个 AA:BB:CC 格式的时间&#xff0c;请你计算它们直接的时间插值&#xff08;秒&#xff09; 解题思路 模拟 代码示例 #include<bits/stdc.h> using namespace std;int h, m, s;int main(){scanf("%d:%d:%d", &…

跨域问题解决方案

什么是跨域问题 跨域问题本质上是由浏览器的同源策略造成的&#xff0c;是浏览器对javascript施加的安全限制。 它指的服务A对服务B发起请求时&#xff0c;如果传输协议&#xff08;http、https&#xff09;、ip 地址&#xff08;域名&#xff09;、端口号有任意一个不同&…

一键轻松拥有自己专属的 ChatGPT 网页版,搭建一个私人的可随时随地访问的ChatGPT网站

前言 ChatGPT是一种基于Transformer架构的自然语言处理模型&#xff0c;由OpenAI开发。GPT是“Generative Pre-trained Transformer”的缩写&#xff0c;意为“预训练生成式Transformer模型”。 ChatGPT模型是一种无监督学习模型&#xff0c;它可以在大规模文本数据上进行预训…

『Linux』第九讲:Linux多线程详解(二)_ 线程控制

「前言」文章是关于Linux多线程方面的知识&#xff0c;上一篇是 Linux多线程详解&#xff08;一&#xff09;&#xff0c;今天这篇是 Linux多线程详解&#xff08;二&#xff09;&#xff0c;讲解会比较细&#xff0c;下面开始&#xff01; 「归属专栏」Linux系统编程 「笔者」…

【2023华中杯数学建模】B 题 小学数学应用题相似性度量及难度评估详细建模方案及实现代码

更新时间&#xff1a;2023-5-1 14:00 1 题目 B 题 小学数学应用题相似性度量及难度评估 某 MOOC 在线教育平台希望能够进行个性化教学&#xff0c;实现用户自主学习。在用户学习时&#xff0c;系统从题库中随机抽取若干道与例题同步的随堂测试题&#xff0c;记录、分析学生的学…

【常用算法】进制转换

目录 1. 二进制数、八进制数、十六进制数转换为十进制数 2. 十进制数转换为二进制数、八进制数、十六进制数 3. 二进制数和十六进制数的相互转换 4. 使用电脑计算器进行进制转换 1. 二进制数、八进制数、十六进制数转换为十进制数 十进制数的每一位都是10的指数幂。如&…

Python 中如何实现自动导入缺失的库?

在编写 Python 项目的时候&#xff0c;我们经常会遇到导入模块失败的错误&#xff1a; ImportError: No module named xxx或者ModuleNotFoundError: No module named xxx 导入失败&#xff0c;通常分为两种&#xff1a;一种是导入自己写的模块&#xff08;即以 .py 为后缀的文件…

每天一道算法练习题--Day17 第一章 --算法专题 --- ----------布隆过滤器

场景 假设你现在要处理这样一个问题&#xff0c;你有一个网站并且拥有很多访客&#xff0c;每当有用户访问时&#xff0c;你想知道这个 ip 是不是第一次访问你的网站。 hashtable 可以么 一个显而易见的答案是将所有的 IP 用 hashtable 存起来&#xff0c;每次访问都去 hash…

微软开源AI修图工具让老照片重现生机

GitHub - microsoft/Bringing-Old-Photos-Back-to-Life: Bringing Old Photo Back to Life (CVPR 2020 oral) 支持划痕修复&#xff0c;以及模型训练。 Old Photo Restoration (Official PyTorch Implementation) Project Page | Paper (CVPR version) | Paper (Journal vers…

Mysql第二章 多表查询的操作

这里写自定义目录标题 一 外连接与内连接的概念sql99语法实现 默认是内连接sql99语法实现左外连接&#xff0c;把没有部门的员工也查出来sql99语法实现右外连接&#xff0c;把没有人的部门查出来sql99语法实现满外连接&#xff0c;mysql不支持这样写mysql中如果要实现满外连接的…

【Java数据结构】——第九节.向上建堆和向下建堆的区别

作者简介&#xff1a;大家好&#xff0c;我是未央&#xff1b; 博客首页&#xff1a;未央.303 系列专栏&#xff1a;Java初阶数据结构 每日一句&#xff1a;人的一生&#xff0c;可以有所作为的时机只有一次&#xff0c;那就是现在&#xff01;&#xff01;&#xff01; 文章目…

Android jetpack Compose之约束布局

概述 我们都知道ConstraintLayout在构建嵌套层级复杂的视图界面时可以有效降低视图树的高度&#xff0c;使视图树扁平化&#xff0c;约束布局在测量布局耗时上比传统的相对布局具有更好的性能&#xff0c;并且约束布局可以根据百分比自适应各种尺寸的终端设备。因为约束布局确…

下载——安装——使用FinalShell

下载——安装——使用FinalShell FinalShell简介&#xff1a;下载&#xff1a;使用&#xff1a; FinalShell简介&#xff1a; FinalShell是一款免费的国产的集SSH工具、服务器管理、远程桌面加速的软件&#xff0c;同时支持Windows&#xff0c;macOS&#xff0c;Linux&#xf…

No.050<软考>《(高项)备考大全》【冲刺4】《软考之 119个工具 (2)》

《软考之 119个工具 &#xff08;2&#xff09;》 21.检查:22.偏差分析:23.滚动式规划:24.紧前关系绘图法(PDM):25.确定依赖关系:26.时间提前量与滞后量:28.发布的估算数据:29.自下而上估算:30.项目管理软件:31.储备分析:32.类比估算:33.参数估算:34.三点估算:35.进度网络分析:…

JS实现拼音(字母)匹配(搜索)汉字(姓名)

这就是个模糊查询&#xff0c;我们平常做的都是直接输入汉字去把对应的值过滤出来&#xff0c;但我还真是第一次通过拼音去查询&#xff08;当然不只是拼音&#xff0c;汉字也是可以的&#xff09;&#xff0c;以前还真没注意这个。唉&#xff0c;这可咋搞&#xff0c;我怎么知…

使用Statsmodel进行假设检验和线性回归

如果你使用 Python 处理数据&#xff0c;你可能听说过 statsmodel 库。Statsmodels 是一个 Python 模块&#xff0c;它提供各种统计模型和函数来探索、分析和可视化数据。该库广泛用于学术研究、金融和数据科学。在本文中&#xff0c;我们将介绍 statsmodel 库的基础知识、如何…

(七)ArcCatalog应用基础——图层操作与数据输出

&#xff08;七&#xff09;ArcCatalog应用基础——图层操作与数据输出 目录 &#xff08;七&#xff09;ArcCatalog应用基础——图层操作与数据输出 1.地图与图层操作1.1创建图层1.2设置文件特征1.3保存独立的图层文件 2.地理数据输出2.1输出为Shapefile2.2输出为Coverage2.3属…