C++初阶 | [二] 类和对象(上)

news2024/11/26 11:41:13

摘要:class,成员函数,成员变量,类的大小,this 指针

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

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


1.  struct → class (类)

Types

  • C语言:当我们用C语言创建一个自定义类型 (The Type is "struct MyBook") 来管理图书,首先在结构体中创建用于描述图书的有关参量,类似书名、价格、……,接着我们需要对此实现数据管理,因此我们需要实现一些函数来满足功能,类似打印图书信息之类的。如下代码。
    #include<stdio.h>
    struct MyBook
    {
    	char book_name[13];
    	double price;
    };
    
    void Print(struct MyBook b_p)
    {
    	printf("%s %f", b_p.book_name, b_p.price);
    }
    
    int main()
    {
    	struct MyBook book = { "xxxx",13.7 };
    	Print(book);
    	return 0;
    }
  • C++:C++兼容C语言,仍然支持使用 struct 结构体,不仅如此,C++引入了 class 类。The Type is "MyBook_C" and "MyBook_CPP"。C语言结构体中只能定义变量,在C++中,结构体内不仅可以定义变量,也可以定义函数。另外,以C++方式实现, struct 中也可以定义函数。
    struct MyBook_C
    {
    	void Print()
    	{
    		//……
    	}
    	char book_name[13];
    	double price;
    };
    
    class MyBook_CPP
    {
    public:
    	void Print()
    	{
    		……
    	}
    private:
    	char* book_name;
    	double price;
    };
    
    int main()
    {
    	MyBook_C book1;
    	MyBook_CPP book2;
    	return 0;
    }
    

访问限定符

  • public:公有,可以被访问的→ struct 默认
  • protected:受保护的
  • private:私有,不可被访问的 → class 默认

class 中“类的成员”默认私有,在 class 类域外不可访问。

访问限定符的作用域:从该访问限定符到下一个访问限定符或结束。

(类内不受访问限定符的限制)

注意:访问限定符只在编译时有用,当数据映射到内存后,没有任何访问限定符上的区别


2. 类成员函数的声明和定义分离_member function

类被定义之后会形成类域。函数声明与定义分离需要指明类域。在类内定义的函数默认是内联函数,代码量小、比较简单的函数一般直接在类中定义。


3. 类成员变量的命名_Conventions

class Date
{
public:
	void Init(int year = 0, int month = 0, int day = 0)
	{
		year = year;
		month = month;
		day = day;
		//局部变量优先,这里的操作是自己赋值给自己
	}
private:
	int year;
	int month;
	int day;
};

所以,建议有所区分地命名: 例如

class Date
{
public:
	void Init(int year = 0, int month = 0, int day = 0)
	{
		_year = year;
		_month = month;
		_day = day;
	}
private:
	int _year;
	int _month;
	int _day;
};

4. sizeof(class)

类的实例化→对象

类对象的大小_空类

class classname{ functions ; variables } 成员函数 functions 对于对象来说就像一个小区的公共区域,它们被存放在公共代码区(代码段);成员变量 variables 类实例化之后,要存储数据,对每一个实例化出来的对象都是私有的,并且这些变量遵循C语言的内存对齐规则,决定了 sizeof(classname) 的大小。如下图所示。

C语言 结构体内存对齐规则:

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

  • 总结:size of class 测试代码如下
  1. 类中由成员变量(和成员函数):遵循 C语言 内存对齐规则
  2. 类中只有成员函数:1 byte,表示占位,用于区分并表示实例化的对象
  3. 空类:1 byte,表示占位,用于区分并表示实例化的对象
    class Date
    {
    public:
    	Date(const int year, const int month, const int day)
    	{
    		_year = year;
    		_month = month;
    		_day = day;
    	}
    private:
    	int _year;// 0 1 2 3 
    	int _month;// 4 5 6 7 
    	int _day;//8 9 10 11 → 12(内存对齐)
    };
    
    class Only_functions
    {
    public:
    	void Print()
    	{
    		cout << "Only_functions" << endl;
    	}
    };
    
    class Empty{};
    
    int main()
    {
    
    	cout << sizeof(Date) << endl;//output:12
    	cout << sizeof(Only_functions) << endl;//output:1
    	cout << sizeof(Empty) << endl;//output:1
    
    	Only_functions o1;
    	o1.Print();
    	cout << sizeof(o1) << endl;//output:1
    
    	return 0;
    }
    


5.this 指针

  1. warning:这里的隐藏的实参和隐藏的形参都不可以显式地写出 。👇 但是可以在类中显示地用:(如下代码,但一般不会像下面这样写,没什么意义)

    class Date
    {
    public:
    	void Init(const int year = 2023, const int month = 1, const int day = 1)
    	{
    		this->_year = year;
    		this->_month = month;
    		this->_day = day;
    	}
    private:
    	int _year;
    	int _month;
    	int _day;
    };
    
  2. warningthis 指针是不可被修改的!(Type* const this = xxxxx),如果对 this 指针本身的内容进行修改会报错。

空指针问题

  1. nullptr -> member function  正常运行
  2. (*nullptr).member function  正常运行

  3. 真正发生了对空指针解引用的情况:


END

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

吃啥大转盘

经常跟朋友出去吃饭&#xff0c;选择太困难了所以写了个简单的转盘&#xff0c;直接copy到txt文本然后把文件后缀改成html即可。 需要换食物直接在文件中找到 list 值按照格式替换一下即可。 效果&#xff1a; 代码块&#xff1a; <html><head><meta http-…

软件测试简历原来是写了这些才让面试官已读不回

前言&#xff1a; 马上就到了面试跳槽涨薪好时候了&#xff0c;最近看很多的小伙伴已经开始投简历了&#xff0c;一天投了几十次几百次&#xff0c;面试官已读不会&#xff0c;面试的机会都没有更别说后面的事情的&#xff0c;这是为什么呢&#xff1f; 很大一部分的原因是的…

内网穿透工具之花生壳(二)

目录 开始教程 第一步&#xff1a;进入管理官网&#xff0c;注册并登录账号 第二步&#xff1a;进入 管理页面 第三步&#xff1a;添加映射表&#xff0c;然后填写一下基本内容 总结&#xff1a;emmm,反正都很快上手&#xff0c;但是这个就免费1G流量,这个免费的还是https…

开发知识点-NodeJs-npm/Pnpm/Vite/Yarn包管理器

包管理器 vue-cli-service 不是内部或外部命令&#xff0c;也不是可运行的程序npm 全局变量pnpmPnpm介绍ViteYarn ‘vue-cli-service’ 不是内部或外部命令&#xff0c;也不是可运行的程序 yarn yarn add vue-amap yarn add vue-amap ant-design-vue npm 全局变量 换主机 新…

掌动智能:云可观测性的主要特点及应用场景

云全景可观测性安全平台是一个跨架构、跨平台的可观测性方案&#xff0c;实现对云环境下的细粒度数据可视化&#xff0c;满足安全部门对云内部安全领域的多场景诉求&#xff0c;包括敏感数据动态监管、云网攻击回溯分析、攻击横移风险监控、云异常流量分析。本文将介绍掌动智能…

vue:如何实现通过判断数组中每个对象的其中一个属性,从而更改另一个属性的值

1、假设一个box为一个包含多个对象的数组&#xff0c;这个box数组可以在方法中定义也可以在data域中定义 let box [{ id: 1, status: 审批中 },{ id: 2, status: 已通过 },{ id: 3, status: 未通过 } ];2、在methods域中写一个方法遍历这个box数组判断每个对象中的status属性是…

【原创】java+swing+mysql校园零食商城设计与实现

摘要&#xff1a; 本文探讨了一个校园零食商城的设计与实现&#xff0c;校园零食商城的设计与实现旨在为学生提供一个方便、快捷的在线购买零食的环境&#xff0c;同时提高商家的销售效率和客户满意度。通过不断优化和完善系统&#xff0c;相信可以为校园内的学生和商家带来更…

接口自动化面试题

1.http请求都包含哪些内容&#xff0c;请求头和请求体有哪些内容 请求行/请求头/请求体/空行 请求行&#xff1a;请求方法字段、URL字段、http协议版本 例如&#xff1a;GET /index.html HTTP/1.1 请求方法&#xff1a;GET、POST、PUT、DELETE、OPTIONS、TRACE、CO…

【PG】PostgreSQL13主从流复制部署(详细可用)

目录 版本 部署主从注意点 1 主库上创建复制用户 2 主库上修改pg_hba.conf文件 3 修改文件后重新加载配置使其生效 4 主库上修改配置文件 5 重启主库pg使参数生效 6 部署从库 7 备份主库数据至从库 停止从库 备份从库的数据库目录 新建数据库数据目录data 创建和…

干货 | 接口自动化测试分层设计与实践总结

接口测试三要素&#xff1a; 参数构造 发起请求&#xff0c;获取响应 校验结果 一、原始状态 当我们的用例没有进行分层设计的时候&#xff0c;只能算是一个“苗条式”的脚本。以一个后台创建商品活动的场景为例&#xff0c;大概流程是这样的(默认已经是登录状态下)&#…

Python--快速入门三

Python--快速入门三 1.Python列表 列表是Python用于储存一系列数据的容器(特点是可以存放不同类型的数据) python_list ["键盘",True,66,88.8] 列表是可变数据类型&#xff0c;可以直接对列表中的元素进行更改而不需要赋值给本身 列表方法&#xff1a; 1.appen…

纯干货:赝势的选择 | VASP计算入门教程,真的超级有用

VASP软件是基于贋势和平面波基组的第一性原理密度泛函计算程序。VASP使用的是平面波基组&#xff0c;电子与原子核之间的相互作用使用投影缀加波贋势&#xff08;Projector Augmented Wave&#xff0c;PAW&#xff09;方法描述&#xff0c;从而进行量子力学计算。VASP采用PAW贋…

成绩公布方式,这样操作更方便

老师们&#xff01;又到了期中&#xff0c;是不是又在为如何安全、高效的公布学生成绩而烦恼呢&#xff1f;别担心&#xff0c;今天我就给大家分享几种超实用的成绩公布方式&#xff0c;不仅减轻了你的工作负担&#xff0c;还能让学生和家长们也方便&#xff01; 1 Excel表格&a…

【Android Studio】Android Studio修改代码编辑区(工作区)背景色

Android Studio 字体大小及背景色的设置 1、 打开File—>Settings 或者 Android Studio—>CtrlAlts 2、 在setting对话框中选中“Editor->Colors&Fonts->Font &#xff0c; 点击Save as,自定义一个主题,选择字体&#xff0c;size和行间距&#xff0c;保存。 3…

Flink -- 状态与容错

1、Stateful Operations 有状态算子&#xff1a; 有状态计算&#xff0c;使用到前面的数据&#xff0c;常见的有状态的算子&#xff1a;例如sum、reduce&#xff0c;因为它们在计算的时候都是用到了前面的计算的结果 总结来说&#xff0c;有状态计算并不是独立存在的&#xf…

C++学习---异常处理机制

文章目录 前言abort()函数 and 返回错误码的异常方式C异常处理机制异常的类别what()函数 前言 abort()函数 and 返回错误码的异常方式 在说C异常处理机制之前&#xff0c;了解一下abort()函数和返回错误码的异常处理。 Abort( )函数的原型位于头文件cstdlib&#xff08;或std…

CSS关于默认宽度

所谓的默认宽度&#xff0c;就是不设置width属性时&#xff0c;元素所呈现出来的宽度 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title></title><style>* {margin: 0;padding: 0;}.box {/…

git 生成公钥

1、通过命令 ssh-keygen 生成 SSH Key&#xff1a; ssh-keygen -t ed25519 -C "Gitee SSH Key" 三次回车 2、查看生成的 SSH 公钥和私钥&#xff1a; ls ~/.ssh/ 3、把公钥设置到git id_ed25519.pub 4、测试 ssh -T gitgitee.com 成功&#xff01;&#xff01;&…

基于减法平均算法的无人机航迹规划-附代码

基于减法平均算法的无人机航迹规划 文章目录 基于减法平均算法的无人机航迹规划1.减法平均搜索算法2.无人机飞行环境建模3.无人机航迹规划建模4.实验结果4.1地图创建4.2 航迹规划 5.参考文献6.Matlab代码 摘要&#xff1a;本文主要介绍利用减法平均算法来优化无人机航迹规划。 …

朋友圈延迟评论,你用过吗?

在社交媒体时代&#xff0c;朋友圈已经成为人们交流和互动的重要平台。然而&#xff0c;在发表评论时&#xff0c;我们往往会被情绪冲昏头脑&#xff0c;或者因为时间紧迫而没有充分思考。这可能会导致一些不恰当的言论&#xff0c;或者错过一些更精准的表达方式。朋友圈延迟评…