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

摘要: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

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

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

相关文章

CSS 网页布局

网页布局有很多种方式&#xff0c;一般分为以下几个部分&#xff1a;头部区域、菜单导航区域、内容区域、底部区域&#xff1a; 1&#xff09;、头部区域位于整个网页的顶部&#xff0c;一般用于设置网页的标题或者网页的logo。 <style> body { margin: 0; } /* 头部样…

【Redis】list常用命令内部编码使用场景

文章目录 前置知识列表类型的特点 命令LPUSHLPUSHXRPUSHRPUSHXLRANGELPOPRPOPLINDEXLREMLINSERTLTRIMLSETLLEN 阻塞版本命令BLPOPBRPOP 命令总结内部编码测试内部编码 使用场景消息队列分频道的消息队列 模拟栈和队列 前置知识 列表类型是⽤来存储多个有序的字符串&#xff0c…

软件测试|Monkey基本参数介绍

说到android移动端稳定性测试&#xff0c;大家通常会想到android系统自动Monkey小猴子&#xff0c;通过Monkey命令模拟用户触摸点击屏幕、滑动、系统按键等操作来对设备上的app进行压力测试&#xff0c;来测试应用的稳定性和健壮性。 下面就说说monkey常用参数的用法~~ 1、-h…

Spring笔记(二)(黑马)(AOP面向切面编程)

01、AOP 简介 1.1 AOP的概念 AOP&#xff0c;Aspect Oriented Programming&#xff0c;面向切面编程&#xff0c;是对面向对象编程OOP的升华。OOP是纵向对一个事物的抽象&#xff0c;一个对象包括静态的属性信息&#xff0c;包括动态的方法信息等。而AOP是横向的对不同事物的…

spdk用户态块层详解

先通过回顾内核态的通用块层来详细介绍SPDK通用块层&#xff0c;包括通用块层的架构、核心数据结构、数据流方面的考量等。最后描述基于通用块层之上的两个特性&#xff1a;一是逻辑卷的支持&#xff0c;基于通用块设备的Blobstore和各种逻辑卷的特性&#xff0c;精简配置&…

C# OpenCvSharp 去除文字中的线条

效果 中间过程效果 项目 代码 using OpenCvSharp; using System; using System.Drawing; using System.Windows.Forms; using static System.Net.Mime.MediaTypeNames;namespace OpenCvSharp_Demo {public partial class frmMain : Form{public frmMain(){InitializeComponent…

Spring面试题:(四)Spring Bean生命周期

Bean生命周期的阶段 实例化初始化完成销毁 IoC容器实例化Bean的流程 Bean定义 Bean工厂处理 反射实例化Bean 初始化 完成存储到单例池 Bean生命周期 Bean初始化话过程 属性填充aware接口BeanPostProcessor前置处理InitialzingBean接口初始化方法自定义init方法BeanPost…

Oracle(15)Managing Users

目录 一、基础知识 1、Users and Security 用户和安全 2、Database Schema 3、Checklist for Creating Users创建用户步骤 二、基础操作 1、创建一个用户 2、OS Authentication 操作系统身份验证 3、Dropping a User 删除用户 4、Getting User Information 获取用户信…

搭建自己的MQTT服务器,实现设备上云(Ubuntu+EMQX)

一、EMQX介绍 这篇文章教大家在ECS云服务器上部署EMQX,搭建自己私有的MQTT服务器,配置EMQX实现设备上云,设备数据转发,存储;服务器我采用的华为云的ECS服务器,系统选择Ubuntu系统。 Windows版本的看这里: https://blog.csdn.net/xiaolong1126626497/article/details/1…

经验模态分解(Empirical Mode Decomposition,EMD)(附代码)

代码原理 EMD&#xff08;Empirical Mode Decomposition&#xff09;&#xff0c;也称为经验模态分解&#xff0c;是一种将非线性和非平稳信号分解成多个本征模态函数&#xff08;Intrinsic Mode Functions&#xff0c;简称IMF&#xff09;的方法。 EMD的基本原理是通过一系列…

掌动智能:UI自动化测试工具产品功能和优势

UI自动化测试工具是一种软件工具&#xff0c;用于模拟用户与应用程序的交互&#xff0c;检查应用程序的用户界面是否按预期工作。这些工具允许开发人员编写测试脚本&#xff0c;以模拟用户操作&#xff0c;例如点击按钮、输入文本、导航菜单等&#xff0c;然后验证应用程序的响…

哪款手机便签软件支持存储录音文件并支持转文字?

手机便签类软件带有存储录音转文字功能是比较实用的&#xff0c;很多人通常会整理很多录音类型的文件&#xff0c;录音文件整合在一起后&#xff0c;后续有需要可以逐条点开播放收听。尤其是在工作中&#xff0c;当领导说一些重点时&#xff0c;大家无法借助灵活的大脑来成功的…

如何判断被DDoS攻击

当网络和设备正常的情况下&#xff0c;服务器突然出现连接断开、访问卡顿、用户掉线等情况;服务器CPU或内存占用率出现明显增长;网络出入流量出现明显增长;网站或应用程序突然出现大量的未知访问;登录服务器失败或者登录过慢等等。以上是最为常见的服务器被 DDoS攻击后出现的几…

2.3 - 网络协议 - ICMP协议工作原理,报文格式,抓包实战

「作者主页」&#xff1a;士别三日wyx 「作者简介」&#xff1a;CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」&#xff1a;对网络安全感兴趣的小伙伴可以关注专栏《网络安全入门到精通》 ICMP协议 1、ICMP协议工作原理2、ICMP协议报文格式…

el-date-picker精确到分钟

0 效果 1 代码 使用format、value-format属性格式化即可 :clearable“false” // 取消删除图标 注意&#xff1a; format&#xff1a;“yyyy-MM-dd HH:mm” 小时默认是从00:00开始 format&#xff1a;“yyyy-MM-dd hh:mm” 小时默认是从12:00开始

【爬虫】Java爬虫爬取某招聘网站招聘信息

目录 前言 一、爬虫程序的基本架构 二、如何获取目标网站的页面内容 三、解析HTML页面&#xff0c;提取所需信息 四、代理IP的使用 五、完整代码 总结 前言 随着互联网的普及&#xff0c;越来越多的人开始关注网络上的招聘信息&#xff0c;而传统的求职方式愈发显得不够…

docker部署mysql

docker部署mysql Docker部署MySQL配置远程登录持久化数据创建容器时配置挂载卷后置配置挂载卷 Docker卸载MySQL部署特定版本mysql【出现1251错误】远程连接docker容器中的mysql8.0数据库时出现连接不上 Docker部署MySQL 要使用Docker部署MySQL&#xff0c;你可以使用官方的MyS…

伊朗黑客对以色列科技和教育领域发起破坏性网络攻击

导语 近期&#xff0c;以色列的高等教育和科技领域遭受了一系列破坏性的网络攻击。这些攻击始于2023年1月&#xff0c;旨在部署以前未记录的数据清除恶意软件。在最近的攻击中&#xff0c;攻击者试图窃取个人身份信息和知识产权等敏感数据。本文将介绍这些攻击的具体细节&#…