C++ 万物起源:类与对象(一)

目录

一、C++与C语言的区别

1.1类的引入

二、C++类

2.1类的概念与定义

2.2类的访问限定符与封装

2.2.1C++中struct和class的区别

2.3封装

2.4类的作用域与实例化

三、类对象模型

3.1类对象的存储模式

3.2结构体内存对齐规则


一、C++与C语言的区别

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

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

1.1类的引入

C语言结构体中只能定义变量,在C++中,结构体内不仅可以定义变量,也可以定义函数。比如:之前在数据结构初阶中,用C语言方式实现的栈,结构体中只能定义变量;现在以C++方式实现,会发现struct中也可以定义函数。

二、C++类

2.1类的概念与定义

class className
{
 // 类体:由成员函数和成员变量组成
 
};  // 一定要注意后面的分号

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

类体中内容称为类的成员:

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

类的两种定义方式:

1. 声明和定义全部放在类体中,需注意:成员函数如果在类中定义,编译器可能会将其当成内 联函数处理。

2. 类声明放在.h文件中,成员函数定义放在.cpp文件中,注意:成员函数名前需要加类名:: 

一般情况下,更期望采用第二种方式。 

成员变量命名规则的建议:

// 我们看看这个函数,是不是很僵硬?
class Date
{
public:
    void Init(int year)
    {
        // 这里的year到底是成员变量,还是函数形参?        
        year = year;
    }
private:
    int year;
};

一般情况下习惯用以下的命名方式:

class Date
{
public:
    void Init(int year) {
        _year = year;
    }
private:
    int _year;
};

2.2类的访问限定符与封装

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

【访问限定符说明】 

1. public修饰的成员在类外可以直接被访问。

2. protected和private修饰的成员在类外不能直接被访问(此处protected和private是类似的)3. 访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止。

4. 如果后面没有访问限定符,作用域就到}即类结束。

5. class的默认访问权限为private,struct为public(因为struct要兼容C)。

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

2.2.1C++中struct和class的区别

解答:C++需要兼容C语言,所以C++中struct可以当成结构体使用。另外C++中struct还可以用来定义类。和class定义类是一样的,区别是struct定义的类默认访问权限是public,class定义的类默认访问权限是private。

2.3封装

面向对象的三大特性:封装、继承、多态。

在类和对象阶段,主要是研究类的封装特性,封装本质上是一种管理,让用户更方便使用类。比如:对于电脑这样一个复杂的设备,提供给用户的就只有开关机键、通过键盘输入,显示器,USB插孔等,让用户和计算机进行交互,完成日常事务。但实际上电脑真正工作的却是CPU、显卡、内存等一些硬件元件。

在C++语言中实现封装,可以通过类将数据以及操作数据的方法进行有机结合,通过访问权限来隐藏对象内部实现细节,控制哪些方法可以在类外部直接被使用。

2.4类的作用域与实例化

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

class Person
{
public:
void PrintPersonInfo(); private:
    char _name[20];
    char _gender[3];
    int  _age;
};
// 这里需要指定PrintPersonInfo是属于Person这个类域
void Person::PrintPersonInfo()
{
    cout << _name << " " << _gender << " " << _age << endl;
}

用类类型创建对象的过程,称为类的实例化:

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

2. 一个类可以实例化出多个对象,实例化出的对象 占用实际的物理空间,存储类成员变量。

int main()
{
    Person._age = 100;   // 编译失败:error C2059: 语法错误:“.”    
    return 0;
}

Person类是没有空间的,只有Person类实例化出的对象才有具体的年龄。

3. 做个比方。类实例化出对象就像现实中使用建筑设计图建造出房子,类就像是设计图,只设计出需要什么东西,但是并没有实体的建筑存在,同样类也只是一个设计,实例化出的对象才能实际存储数据,占用物理空间。

三、类对象模型

3.1类对象的存储模式

  • 类成员变量存储在实例化对象中
  • 类成员函数存储在公共的代码段

class A1 {
public:
	void f1() {}
private:
	int _a;
};
// 类中仅有成员函数
class A2 {
public:
	void f2() {}
};
// 类中什么都没有---空类
class A3
{};

int main()
{

	int a = sizeof(A1);
	cout << a<<endl;
	a = sizeof(A2);
	cout << a<<endl;
	a = sizeof(A3);
	cout << a<<endl;

	return 0;
}

通过以上代码我们可以对类对象的存储做出初步的推测

可以看到A1的大小是4字节,A2/A3都是1字节。

所以可以得出,成员函数是不包含在我们用类实例化出的对象之中的。

结论:

1.一个类的大小,实际就是该类中”成员变量”之和,当然要注意内存对齐

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

3.2结构体内存对齐规则

1. 第一个成员在与结构体偏移量为0的地址处。

2. 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。

注意:对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值。VS中默认的对齐数为8

3. 结构体总大小为:最大对齐数(所有变量类型最大者与默认对齐参数取最小)的整数倍。

4. 如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。

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

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

相关文章

毕设学习进展周报

文章目录 3.11-3.18 3.11-3.18 1.阅读ACL文献并记录 2.查找相关资料学习在阿里云部署ChatGLM3-6B 参考&#xff1a;https://blog.csdn.net/H66778899/article/details/135630030 # 运行 streamlit run /mnt/workspace/ChatGLM3/conposite_demo/main.py可以得到&#xff1a;…

jscpd对项目进行查重(支持150+类语言)

jscpd jscpd 查重时能够跳过标记为忽略的块和新行以及空符号和注释&#xff08;不支持尖括号注释<!-- --&#xff01;>&#xff09;&#xff0c;重复率判定依据为一定长度标识符的MD5值是否相同。 安装 npm install -g jscpd配置参数(查看更多) OptionTypeDefaultDes…

Windows系统安装GeoServe结合内网穿透实现公网访问本地位置信息服务

文章目录 前言1.安装GeoServer2. windows 安装 cpolar3. 创建公网访问地址4. 公网访问Geo Servcer服务5. 固定公网HTTP地址 前言 GeoServer是OGC Web服务器规范的J2EE实现&#xff0c;利用GeoServer可以方便地发布地图数据&#xff0c;允许用户对要素数据进行更新、删除、插入…

抖音视频批量下载工具|无水印视频提取软件

抖音视频批量下载工具安装教程 一&#xff1a;双击安装包 二&#xff1a;进入安装主界面 然后点击接收Q:290615413 三&#xff1a;接受后进入安装模式 设置好安装路径 系统默认的是D盘然后点击解压 四&#xff1a;点击解压后安装等待安装 安装成功后桌面会有 抖音视频批量提取工…

Python进程与线程开发

目录 multiprocessing模块 线程的开发 threading模块 setDaemon 死锁 线程间的通信 multiprocessing模块 运行python的时候&#xff0c;我们都是在创建并运行一个进程&#xff0c;(linux中一个进程可以fork一个子进程&#xff0c;并让这个子进程exec另外一个程序)。在pyt…

算法设计与分析(贪心法)

学习的最大理由是想摆脱平庸&#xff0c;早一天就多一份人生的精彩&#xff1b;迟一天就多一天平庸的困扰。各位小伙伴&#xff0c;如果您&#xff1a; 想系统/深入学习某技术知识点… 一个人摸索学习很难坚持&#xff0c;想组团高效学习… 想写博客但无从下手&#xff0c;急需…

Vulnhub - Symfonos

希望和各位大佬一起学习&#xff0c;如果文章内容有错请多多指正&#xff0c;谢谢&#xff01; 个人博客链接&#xff1a;CH4SER的个人BLOG – Welcome To Ch4sers Blog Symfonos 靶机下载地址&#xff1a;https://www.vulnhub.com/entry/symfonos-1,322/ 0x01 信息收集 …

[保姆级教程]Windows安装MongoDB教程

文章目录 MongoDB安装包下载1.点击进入mongodb官网2.点击MongoDB Community Edition&#xff08;社区版&#xff09;&#xff0c;进入下图界面3.选择版本4.下载5.安装6.勾选同意协议&#xff0c;点击“Next"7.选择自定义安装8.点击“Next"9.修改到合适的地址10.点击i…

影响汇率的因素?fpmarkets澳福总结几个

汇率对于刚刚开始外汇交易的新手来说非常重要&#xff0c;这不是没有道理的&#xff0c;了解汇率如何变化以及怎么变化有助于在外汇交易中获得稳定的利润。那么影响汇率的因素有哪些&#xff1f;fpmarkets澳福总结几个。 任何国家货币的汇率都是由市场决定的。主要的市场因素是…

盲盒抽卡机小程序开发:开启惊喜之旅,探索无限可能

随着互联网的快速发展&#xff0c;消费者的购物体验也在不断升级。盲盒文化&#xff0c;以其独特的魅力和惊喜感&#xff0c;正逐渐成为年轻人追求潮流、享受乐趣的新选择。为了满足广大盲盒爱好者的需求&#xff0c;我们精心打造了这款盲盒抽卡机小程序&#xff0c;为用户带来…

代码随想录算法训练营第43天 | 1049.最后一块石头的重量II ,494.目标和,474.一和零

动态规划章节理论基础&#xff1a; https://programmercarl.com/%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%92%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html 1049.最后一块石头的重量II 题目链接&#xff1a;https://leetcode.cn/problems/last-stone-weight-ii/ 思路&#xff1a; …

阿里巴巴国际站商品采集商品信息抓取API免费测试入口(英文商品信息跨境电商商品信息自动化抓取)

alibaba.item_get 获取商品详情信息 alibaba.item_search 关键字搜索商品列表 进入API测试页&#xff0c;获取key和密钥 公共参数 名称类型必须描述keyString是调用key&#xff08;必须以GET方式拼接在URL中&#xff09;secretString是调用密钥api_nameString是API接口名称…

Docker学习之使用harbor搭建私有仓库(超详解析)

实验目的&#xff1a; 使用centos7&#xff0c;基于harbor构建私有仓库 实验步骤&#xff1a; 下载相关安装包和依赖&#xff1a; [rootlocalhost ~]# yum install -y yum-utils device-mapper-persistent-data lvm2 wget //安装docker所需要的相关依赖 [rootlocalhost ~]#…

中国休闲装行业深度调研分析

环洋咨询Global Info Research的休闲装市场调研报告提供休闲装市场的基本概况&#xff0c;包括定义&#xff0c;分类&#xff0c;应用和产业链结构&#xff0c;同时还讨论发展政策和计划以及制造流程和成本结构&#xff0c;分析休闲装市场的发展现状与未来市场趋势&#xff0c;…

java入门-变量与常量

java 基本语法-变量与常量 变量 变量的本质 程序中我们会经常看到类似 int x 3**;** 的表达式&#xff0c;x就是我们常说的变量&#xff0c;从计算机角度我们来看看变量x的本质是什么&#xff1f; 在程序开发中定义一个变量x, 计算机会在内存中开辟内存空间&#xff0c;计算…

【C语言基础】:字符函数和字符串函数

文章目录 一、字符函数1. 字符分类函数2. 字符转化函数 二、字符串函数1. strlen函数的使用和模拟实现strlen函数的使用strlen函数的模拟实现 2. strcpy函数的使用和模拟实现strcpy函数的使用strcpy函数的模拟实现 3. strcat函数的使用和模拟实现strcat函数的使用strcat函数的模…

鸿蒙Harmony应用开发—ArkTS声明式开发(容器组件:Grid)

网格容器&#xff0c;由“行”和“列”分割的单元格所组成&#xff0c;通过指定“项目”所在的单元格做出各种各样的布局。 说明&#xff1a; 该组件从API Version 7开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 子组件 仅支持GridItem…

MasterAlign视觉对位软件提示系统校准时间错误解决方案

MasterAlign视觉对位软件提示系统校准时间错误解决方案 一、问题现象 当运行软件时弹出“系统校准时间错误”的提示&#xff0c;如下图&#xff1a; 出现“系统校准时间错误”提示&#xff0c;说明当前系统时间比上一次软件运行时的系统时间提前了&#xff0c;需要修改当前系…

Windows系统搭建web网站并结合内网穿透实现公网访问本地站点

文章目录 使用工具1. 本地搭建web网站1.1 下载phpstudy后解压并安装1.2 打开默认站点&#xff0c;测试1.3 下载静态演示站点1.4 打开站点根目录1.5 复制演示站点到站网根目录1.6 在浏览器中&#xff0c;查看演示效果。 2. 将本地web网站发布到公网2.1 安装cpolar内网穿透2.2 映…

苹果MacOS电脑使用内网穿透轻松远程桌面本地Windows系统电脑

文章目录 1. 测试本地局域网内远程控制1.1 Windows打开远程桌面1.2 局域网远程控制windows 2. 测试Mac公网远程控制windows2.1 在windows电脑上安装cpolar2.2 Mac公网远程windows 3. 配置公网固定TCP地址 日常工作生活中&#xff0c;有时候会涉及到不同设备不同操作系统之间需要…