C++:类的定义、实例化

news2024/11/15 15:42:52

目录

一、类的定义

1.1 类的定义格式

1.2 访问限定符

1.3 类域

二、实例化

2.1 实例化概念

2.2 对象大小


一、类的定义

1.1 类的定义格式

• class为定义类的关键字,Stack为类的名字,{}中为类的主体,注意类定义结束时后面分号不能省略,类体中内容称为类的成员:类中的变量称为类的属性或成员变量,类中的函数称为类的方法或者成员函数。

• 为了区分成员变量,一般习惯上成员变量会加⼀个特殊标识,如成员变量前面或者后面加_ 或者  m 开头,注意C++中这个并不是强制的,只是⼀些惯例。

• C++中struct也可以定义类,C++兼容C中struct的用法,同时struct升级成了类,明显的变化是 struct中可以定义函数,⼀般情况下我们还是推荐用class定义类。

• 定义在类面的成员函数默认为inline。

class Date
{
public:
 void Init(int year, int month, int day)
 {
 _year = year;
 _month = month;
 _day = day;
 }
private:
 // 为了区分成员变量,⼀般习惯上成员变量 
 // 会加⼀个特殊标识,如_ 或者 m开头 
 int _year; // year_ m_year
 int _month;
 int _day;
};
int main()
{
 Date d;
 d.Init(2024, 3, 31);
 return 0;
}

     值得注意一点的是在C++中struct升级成了类,类里面可以定义函数,struct名称就可以代表类型,不再需要typedef,但是可以写,C++也兼容C中的struct写法。

// C++兼容C中struct的⽤法 
typedef struct ListNodeC
{
 struct ListNodeC* next;
 int val;
}LTNode;
// 不再需要typedef,ListNodeCPP就可以代表类型 
struct ListNodeCPP
{
 void Init(int x)
 {
 next = nullptr;
 val = x;
 }
 ListNodeCPP* next;
 int val;
};

1.2 访问限定符

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

• public修饰的成员在类外可以直接被访问;protected和private修饰的成员在类外不能直接被访 问,protected和private是一样的,以后继承章节才能体现出他们的区别。

• 访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止,如果后面没有 访问限定符,作用域就到 } 即类结束。

• class定义成员没有被访问限定符修饰时默认为private,struct默认为public。

• ⼀般成员变量都会被限制为private/protected,需要给别人使用的成员函数会放为public。 

 

1.3 类域

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

• 类域影响的是编译的查找规则,下面程序中Init如果不指定类域Stack,那么编译器就把Init当成全局函数,那么编译时,找不到array等成员的声明/定义在哪里,就会报错。指定类域Stack,就是知道Init是成员函数,当前域找不到的array等成员,就会到类域中去查找。

#include<iostream>
using namespace std;
class Stack
{
public:
 // 成员函数 
 void Init(int n = 4);
private:
 // 成员变量 
 int* array;
 size_t capacity;
 size_t top;
};
// 声明和定义分离,需要指定类域 
void Stack::Init(int n)
{
 array = (int*)malloc(sizeof(int) * n);
 if (nullptr == array)
 {
 perror("malloc申请空间失败");
 return;
 }
 capacity = n;
 top = 0;
}
int main()
{
 Stack st;
 st.Init();
 return 0;
}

二、实例化

2.1 实例化概念

• 用类类型在物理内存中创建对象的过程,称为类实例化出对象。

• 类是对象进行⼀种抽象描述,是⼀个模型⼀样的东西,限定了类有哪些成员变量,这些成员变量只是声明,没有分配空间,用类实例化出对象时,才会分配空间。

• ⼀个类可以实例化出多个对象,实例化出的对象占用实际的物理空间,存储类成员变量。打个比方:类实例化出对象就像现实中使用建筑设计图建造出房子,类就像是设计图,设计图规划了有多 少个房间,房间大小功能等,但是并没有实体的建筑存在,也不能住人,用设计图修建出房子,房 子才能住人,同样类就像设计图一样,不能存储数据,实例化出的对象分配物理内存存储数据。

 

#include<iostream>
using namespace std;
class Date
{
public:
 void Init(int year, int month, int day)
 {
 _year = year;
 _month = month;
 _day = day;
 }
 void Print()
 {
 cout << _year << "/" << _month << "/" << _day << endl;
 }
private:
 // 这⾥只是声明,没有开空间 
 int _year;
 int _month;
 int _day;
};
int main()
{
 // Date类实例化出对象d1和d2 
 Date d1;
 Date d2;
 d1.Init(2024, 3, 31);
 d1.Print();
 d2.Init(2024, 7, 5);
 d2.Print();
 return 0;
}

2.2 对象大小

    分析⼀下类对象中哪些成员呢?类实例化出的每个对象,都有独立的数据空间,所以对象中肯定包含成员变量,那么成员函数是否包含呢?首先函数被编译后是⼀段指令,对象中没办法存储,这些指令存储在一个单独的区域(代码段),那么对象中非要存储的话,只能是成员函数的指针,再分析一下,对象中是否有存储指针的必要呢,Date实例化d1和d2两个对象,d1和d2都有各自独立的成员变量 _year/_month/_day存储各自的数据,但是d1和d2的成员函数Init/Print指针却是⼀样的,存储在对象中就浪费了,如果用Date实例化100个对象,那么成员函数指针就重复存储100次,太浪费了。 

 

    上面我们分析了对象中只存储成员变量,C++规定类实例化的对象也要符合内存对齐的规则。

内存对齐规则

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

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

• 对齐数 = 编译器默认的⼀个对齐数与该成员大小的较小值。

• VS中默认的对齐数为8。

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

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

class B
{
public:
 void Print()
 {
 //...
 }
};
class C
{};

     上面的程代码成员变量的B和C类对象的大小是1为什么没有成员变量还要给1个 字节呢?因为如果一个字节都不给,怎么表示对象存在过呢!所以这里给1字节,纯粹是为了占位标识 对象存在。


    本篇关于类的定义和实例化的内容就到这里了,希望对各位有帮助,如果有错误欢迎指出。

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

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

相关文章

设备上的实时自定义手势识别

这篇论文的标题是《On-device Real-time Custom Hand Gesture Recognition》&#xff0c;主要研究了如何在移动设备上实时识别自定义手势。以下是论文的主要内容概述&#xff1a; 摘要&#xff1a; 论文指出现有的手势识别系统大多限于预定义的手势集&#xff0c;但用户和开发…

鸿蒙(HarmonyOS)常见的三种弹窗方式

最近有一个想法&#xff0c;做一个针对鸿蒙官方API的工具箱项目&#xff0c;介绍常用的控件&#xff0c;以及在项目中如何使用&#xff0c;今天介绍Harmony中如何实现弹窗功能。 警告弹窗 警告弹窗是一个App中非常常用的弹窗&#xff0c;例如&#xff1a; 删除一条记录&…

帕金森患者在运动时有哪些类型的运动推荐?

帕金森病患者在进行运动时&#xff0c;可以考虑以下几种类型的运动&#xff1a; 有氧运动&#xff1a;如散步、慢跑、爬山、骑自行车、健美操、广场舞等&#xff0c;这些运动有助于改善心肺功能&#xff0c;同时也能提升肌肉力量和灵活性。 柔性运动&#xff1a;包括瑜伽、太极…

<Rust>egui学习之小部件(七):如何在窗口中添加颜色选择器colorpicker部件?

前言 本专栏是关于Rust的GUI库egui的部件讲解及应用实例分析&#xff0c;主要讲解egui的源代码、部件属性、如何应用。 环境配置 系统&#xff1a;windows 平台&#xff1a;visual studio code 语言&#xff1a;rust 库&#xff1a;egui、eframe 概述 本文是本专栏的第七篇博…

笔记整理—内核!启动!

常规启动时&#xff0c;各镜像都在SD卡中的各种分区中&#xff0c;内核放在kernel分区&#xff0c;从SD卡到DDR的连接处&#xff08;内核不需要进行重定位&#xff0c;直接从链接处启动&#xff09;。uboot从sd卡分区读使用movi命令。 使用fastboot指令可以查看分区情况&#x…

【赵渝强老师】MongoDB的MMAPv1存储引擎

在MongoDB 3.2版本以前&#xff0c;MongoDB使用MMAPv1作为默认的存储引擎。在MMAPv1的存储引擎中&#xff0c;包含以下的组成部分&#xff1a; Database 每个Database由一个.ns名称空间文件及若干个数据文件组成。数据文件从0开始编号&#xff0c;依次为.0、.1、.2等。数据文件…

小心GitHub账号被盗

最近有小伙伴反馈在 GitHub 上解压了不明文件之后&#xff0c;GitHub 账号被盗了。 事情是这样的&#xff1a; 有小伙伴在 GitHub 某仓库的 issue 中正常和人讨论问题&#xff0c;有个人光速回复了一条消息&#xff0c;给了一个链接&#xff0c;让下载一个名为 fix.rar 的文件…

C++系列-STL容器之list

STL容器之list list容器的基本结构list容器的特点list容器的优点list容器的缺点 list容器的构造函数list容器的常用接口list大小及空否list访问list迭代器相关list增删查改push and popinsert其它 list赋值操作 list容器的基本结构 list容器的内部结构是双向循环链表&#xff…

Java笔试面试题AI答之面向对象(8)

文章目录 43. 解释Java接口隔离原则和单一原则如何理解 &#xff1f;单一职责原则&#xff08;Single Responsibility Principle, SRP&#xff09;接口隔离原则&#xff08;Interface Segregation Principle, ISP&#xff09; 44. Java 有没有 goto? 如果有&#xff0c;一般用…

004.Python爬虫系列_web请求全过程剖析(重点)

我 的 个 人 主 页&#xff1a;&#x1f449;&#x1f449; 失心疯的个人主页 &#x1f448;&#x1f448; 入 门 教 程 推 荐 &#xff1a;&#x1f449;&#x1f449; Python零基础入门教程合集 &#x1f448;&#x1f448; 虚 拟 环 境 搭 建 &#xff1a;&#x1f449;&…

2024年8月31日历史上的今天大事件早读

1449年8月31日 明朝“土木之变” 1907年8月31日 英、法、俄三国协约形成 1914年8月31日 “骆派”京韵大鼓的创建者骆玉笙诞生 1916年8月31日 蔡锷东渡日本养病 1935年8月31日 美国通过《中立法案》 1937年8月31日 日本华北方面军成立 1941年8月31日 晋察冀边区完成民主大…

2024最新最全:国内外人工智能AI工具网站大全!

国内外人工智能AI工具网站大全&#xff08;一键收藏&#xff0c;应有尽有&#xff09; 摘要一、AI写作工具二、AI图像工具 2.1、常用AI图像工具2.2、AI图片插画生成2.3、AI图片背景移除2.4、AI图片无损调整2.5、AI图片优化修复2.6、AI图片物体抹除 三、AI音频工具四、AI视频工…

南京观海微电子----CMOS门电路(OD门、传输门、双向模拟开关、三态门)

【 1. MOS管】 MOS管&#xff1a;绝缘栅型场效应管。 【 2. CMOS电路】 当NMOS管和PMOS管成对出现在电路中&#xff0c;且二者在工作中互补&#xff0c;称为CMOS管(Complementary Metal-Oxide-Semiconductor)。 电路结构 拉电流 如下图所示&#xff0c;输入低电平&#xff…

王者荣耀 设置游戏头像 不用微信头像

我们在微信 我 选择 设置 在里面找到 个人信息与权限 如果找不到看看有木有一个叫隐私的选项 点击 进入之后 选择授权管理 找到王者荣耀 然后点击右侧的小箭头进入 点击下面的 解除授权 确认一下 解除授权 然后重新打开王者 选择微信登录 我们这里 选择新建昵称头像 选…

线性代数之线性方程组

目录 线性方程组 1. 解的个数 齐次线性方程组&#xff1a; 非齐次线性方程组&#xff1a; 2. 齐次线性方程组的解 3. 非齐次线性方程组的解 4. 使用 Python 和 NumPy 求解线性方程组 示例代码 齐次线性方程组 非齐次线性方程组 示例结果 齐次线性方程组 非齐次线性…

Unity获取SceneView尺寸

获取SceneView尺寸 var sceneView SceneView.lastActiveSceneView; var size new Vector2(sceneView.position.width,sceneView.position.height);

Elasticsearch学习(1)-mac系统安装elasticsearch基础

Elasticsearch基础 1. 传统数据库与elasticsarch2. 下载Elasticsearch7. 经过上述所有操作&#xff0c;就可以得到一个具体的连接可视化页面3. 安装kibana4. 其余知识点 elasticsearch是什么&#xff1f; Elasticsearch 是一个分布式、高扩展、高实时的搜索与数据分析引擎。它能…

sql-labs靶场(41-50)

四十一 1.查看数据库名 ?id-1 union select 1,2,database()-- 2.查看表名 ?id-1 union select 1,group_concat(table_name),3 from information_schema.tables where table_schemadatabase()-- 3.查看user表列名 ?id-1 union select 1,group_concat(column_name),3 from…

SpringMVC处理流程介绍

SpringMVC请求处理流程 发起请求到前端控制器(DispatcherServlet)前端控制器请求HandlerMapping查找Handler(可以根据xml配置,注解进行查找) 对应Spring源码 //在类DispatcherServlet里面 protected void doDispatch(HttpServletRequest request, HttpServletResponse respon…

Leetcode102二叉树的层序遍历(java实现)

今天分享的题目是lee102题&#xff0c;题目的描述如下&#xff1a; 可能做到这道题的小伙伴写过其他关于二叉树的题目&#xff0c;但是一般是使用递归的方式做一个深度遍历&#xff0c;而层序遍历我们该如何做呢&#xff1f; 解题思路&#xff1a;使用一个队列来记录本层节点&a…