当前位置: 首页 > news >正文

C++ 类和对象(初篇)

类的引入

C语言中,结构体中只能定义变量,在C++中,结构体内不仅可以定义变量,也可以定义函数。

而为了区分C和C++我们将结构体重新命名成class去定义

类的定义

标准格式:

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

注意:结构体不是函数,不管是C的struct还是C++的class 最后大括号完了都得加上“;”

class为定义类的关键字,ClassName为类的名字,{}中为类的主体,注意类定义结束时后面分号。 类中的元素称为类的成员:类中的数据称为类的属性或者成员变量; 类中的函数称为类的方法或者成员函数。

类的两种定义方式:

声明和定义都在结构体中:

同一个.cpp文件下#include <iostream>
using namespace std;
//. 声明和定义全部放在类体中
class Date
{
public://结构体中的函数void Init(int year,int month ,int day){_year = year;_month = month;_day = day;}void ShowDate(){cout << _year << "-" << _month << "-" << _day << endl;}
public://结构体中的变量int _year;//年int _month;int _day;};
int main()
{Date dt;dt.Init(2024, 4, 1);dt.ShowDate();return 0;
}

声明在.h,定义在.cpp(常用):

.h声明 person#include <iostream>
using namespace std;
//. 声明和定义全部放在类体中
class Date
{
public://结构体中的函数void Init(int year, int month, int day);void ShowDate();
public://结构体中的变量int _year;//年int _month;int _day;
};.C++ person#include "person.h"//结构体中的函数
void Date::Init(int year, int month, int day)
{_year = year;_month = month;_day = day;
}
void Date::ShowDate()
{cout << _year << "-" << _month << "-" << _day << endl;
}.C++ main
#include "person.h"int main()
{Date dt;dt.Init(2024, 4, 1);dt.ShowDate();return 0;
}

为什么使用域作用限定符?

回答:当在不同文件中声明定义,可能会出现相同函数,但是又因为结构体和命名空间等的包装,就需要专门::去打开。

成员变量前加“_”

成员变量(结构体里的变量)和函数参数变量都为相同的时,无法区分,为了更明显表现在代码上各变量关系,常用“_”来表示成员变量

类的访问限定符及封装:

上图一个会报错一个不会报错,其中最关键的在于public。由此我们能看出这个结构体默认是不让你胡乱在结构体外修改他的结构体内的变量的。

我们并不希望结构体内的有些东西会被修改,例如成员变量。

访问限定符:

说明:

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

2. protected和private修饰的成员在类外不能直接被访问(此处protected和private是类似的)

3. 访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止

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

封装:

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

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

定义:封装:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行 交互。

本质:通过将我们想要保护的隐私东西用保险箱保护(封装)起来。

通过不同的保护容器来实现不同的效果,例如,可以公开的信息就用透明箱子等;

类的作用域

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

类的实例化

定义:用类类型创建对象的过程,称为类的实例化(由图纸->实物)

1.类只是一个模型一样的东西,限定了类有哪些成员,定义出一个类并没有分配实际内存空间来存储它

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

简单理解:类只是给你设计了一个住宅区的建筑图纸,你可以用这份图纸在任何地方去建造住宅区,这个过程(给类申请空间)就叫做实例化过程;

//类--设计图纸
class Date
{
public:void Init(int year, int month, int day){_year = year;_month = month;_day = day;}void ShowDate(){cout << _year << "-" << _month << "-" << _day << endl;}
public:int _year;int _month;int _day;
};int main()
{Date dt;//类的实例化--开实际空间dt.Init(2024, 4, 1);dt.ShowDate();return 0;
}

类的对象大小的计算

结论:一个类的大小,实际就是该类中”成员变量”之和,当然也要进行内存对齐,注意空类的大小,空类比较特殊,编译器给了空类一个字节来唯一标识这个类

类的存储位置

注意:类里面函数运行的指令是存在代码段里,但是运行过程中的参数是存在栈里

结构体内存对齐规则:
1. 第一个成员在与结构体偏移量为0的地址处。

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

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

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

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

类成员函数this指针

由来:C++编译器给每个“非静态的成员函数“增加了一个隐藏的指针参数,让该指针指向当前对象(函数运行时调用该函数的对象),在函数体中所有成员变量的操作,都是通过该指针去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成。

this指针的特性:

1.this指针的类型:类类型* const

2. 只能在“成员函数”的内部使用

3.this指针是成员函数第一个隐含的指针形参,一般情况由编译器通过ecx寄存器自动传递,不需要用户传递

4.this指针本质上其实是一个成员函数的形参,是对象调用成员函数时,将对象地址作为实参传递给this 形参。所以对象中不存储this指针。

this存在哪里?

1.栈,因为他是隐含形参

2.VS下,是通过ecx寄存器

空指针问题:

//测试空指针问题
class Date
{
public:void Init(int year, int month, int day){cout << this << endl;this->_year = year;this->_month = month;this->_day = day;}void Show(){cout << this << endl;cout << "func()" << endl;}
public:int _year;int _month;int _day;
};int main()
{Date d1;d1.Init(1111, 11, 1);Date* ptr = nullptr;ptr->Show();		   //正常运行(*ptr).Show();          //正常运行ptr->Init(3333, 33, 3);//运行崩溃return 0;
}

重点:解引用使用时主要看我们所申请的这个对象里包不包括我们要调用的函数或者变量。

解读代码:

结构体的解引用不一定都是有效的,例如ptr->Init()这里进去后要修改_year的数据,此时ptr解引用后并无实际存储数据空间,只是单纯的申请了了一个地址空间。所以此时解引用后是无法进行操作的。

show函数他只进行显示地址等并没有数据的操作过程

相关文章:

C++ 类和对象(初篇)

类的引入 C语言中&#xff0c;结构体中只能定义变量&#xff0c;在C中&#xff0c;结构体内不仅可以定义变量&#xff0c;也可以定义函数。 而为了区分C和C我们将结构体重新命名成class去定义 类的定义 标准格式&#xff1a; class className {// 类体&#xff1a;由成员函…...

微软推出GPT-4 Turbo优先使用权:Copilot for Microsoft 365商业用户享受无限制对话及增强图像生成能力

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…...

Spring Boot Actuator

概述 Spring Boot Actuator是Spring Boot的一个功能模块&#xff0c;用于提供生产环境中常见的监控和管理功能。它提供了各种端点&#xff08;endpoints&#xff09;&#xff0c;可以用于监视应用程序的运行状况、收集应用程序的指标数据以及与应用程序进行交互。 以下是Spri…...

我与C++的爱恋:类与对象(一)

​ ​ &#x1f525;个人主页&#xff1a;guoguoqiang. &#x1f525;专栏&#xff1a;我与C的爱恋 ​C语言是面向过程的&#xff0c;关注的是过程&#xff0c;分析出求解问题的步骤&#xff0c;通过函数调用逐步解决问题。 C是基于面向对象的&#xff0c;关注的是对象&…...

os模块篇(十八)

文章目录 os._exit(n)os.forkpty()os.kill(pid, sig, /)os.killpg(pgid, sig, /)os.nice(increment, /)os.pidfd_open(pid, flags0)os.plock(op, /)os.popen(cmd, moder, buffering-1)os.posix_spawn(path, argv, env, *, file_actionsNone, setpgroupNone, resetidsFalse, set…...

Oracle 数据库工作中常用知识点:sql语法与常用函数

.to_date()函数 to_date函数是Oracle特有的函数&#xff0c;该函数用来做日期转换。 举例&#xff1a; SELECT TO_DATE(‘2006-05-01 19:25:34’, ‘YYYY-MM-DD HH24:MI:SS’) FROM DUAL   日期格式&#xff1a;     YYYY、YYY、YY 分别代表4位、3位、2位的数字年    …...

软件工程

开发模型 瀑布模型 用于结构化模型开发 适用需求明确或者二次开发 原型模型 适用需求不明确 演化模型 增量模型 适用需求不明确 先做一块&#xff0c;再做一块&#xff0c;这样不断的对核心功能的审视&#xff0c;降低风险 螺旋模型 由多个模型组合成 适用需求不明…...

【御控物联】JavaScript JSON结构转换(17):数组To对象——键值互换属性重组

文章目录 一、JSON结构转换是什么&#xff1f;二、核心构件之转换映射三、案例之《JSON数组 To JSON对象》四、代码实现五、在线转换工具六、技术资料 一、JSON结构转换是什么&#xff1f; JSON结构转换指的是将一个JSON对象或JSON数组按照一定规则进行重组、筛选、映射或转换…...

免注册,ChatGPT可即时访问了!

AI又有啥进展&#xff1f;一起看看吧 Apple进军个人家用机器人 Apple在放弃自动驾驶汽车项目并推出混合现实头显后&#xff0c;正在进军个人机器人领域&#xff0c;处于开发家用环境机器人的早期阶段 报告中提到了两种可能的机器人设计。一种是移动机器人&#xff0c;可以跟…...

探索未来游戏:生成式人工智能AI如何重塑你的游戏世界?

生成式人工智能&#xff08;Generative AI&#xff09;正以前所未有的速度改变着各行各业的运作模式。其中&#xff0c;游戏产业作为科技应用的前沿阵地&#xff0c;正经历着前所未有的变革。本文将探讨生成式人工智能如何重塑游戏产业&#xff0c;以及这一变革背后的深远影响。…...

ubuntu23设置kibana后台启动服务

要在Ubuntu 23系统中设置Kibana作为系统服务&#xff0c;以便能够通过systemd管理其启动、停止、重启以及设置开机自动启动&#xff0c;可以按照以下步骤操作&#xff1a; 1. 创建Kibana systemd服务单元 创建一个名为kibana.service的文件在 /etc/systemd/system/ 目录下&am…...

身份证实名制、C#身份核验代码示例、身份证查询

在以前&#xff0c;企业采用人工审核的方式对线上用户进行身份信息真伪的核验&#xff0c;在用户上传身份信息后&#xff0c;人工进行后台审核&#xff0c;虽能满足企业对用户实名认证的需求&#xff0c;但效率慢、耗时长&#xff0c;且存在一定的人为误差&#xff0c;对高度PS…...

【leetcode面试经典150题】15.分发糖果(C++)

【leetcode面试经典150题】专栏系列将为准备暑期实习生以及秋招的同学们提高在面试时的经典面试算法题的思路和想法。本专栏将以一题多解和精简算法思路为主&#xff0c;题解使用C语言。&#xff08;若有使用其他语言的同学也可了解题解思路&#xff0c;本质上语法内容一致&…...

Elasticsearch如何选择版本

不同版本的ES差异非常大&#xff0c;包括不局限于ES语法、架构、API、集群搭建等等。这些差异足以导致不同版本是否能满足你的业务场景以及后续开发维护成本等各种问题。 先说结论&#xff0c;以个人实践经验及综合考虑推荐使用 7.x 版本中的 7.10版本 ES版本对比 以下是通过…...

P8749 [蓝桥杯 2021 省 B] 杨辉三角形

[蓝桥杯 2021 省 B] 杨辉三角形 题目描述 下面的图形是著名的杨辉三角形: 如果我们按从上到下、从左到右的顺序把所有数排成一列&#xff0c;可以得到如下数列&#xff1a; 1 , 1 , 1 , 1 , 2 , 1 , 1 , 3 , 3 , 1 , 1 , 4 , 6 , 4 , 1 , … 1,1,1,1,2,1,1,3,3,1,1,4,6,4,1, …...

MySQL数据库——1.创建数据库

在 MySQL 数据库中&#xff0c;要创建一个新的数据库&#xff0c;可以使用 SQL 命令 CREATE DATABASE。创建数据库是管理数据的第一步&#xff0c;它提供了一个容器&#xff0c;用于存储表、视图、存储过程等数据库对象。 示例&#xff1a; CREATE DATABASE my_database; 在…...

计算机视觉研究院 | Drone-YOLO:一种有效的无人机图像目标检测

本文来源公众号“计算机视觉研究院”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;Drone-YOLO&#xff1a;一种有效的无人机图像目标检测 无人机图像中的目标检测是各个研究领域的重要基础。然而&#xff0c;无人机图像带来了独…...

[C#]使用OpencvSharp去除面积较小的连通域

【C介绍】 关于opencv实现有比较好的算法&#xff0c;可以参考这个博客OpenCV去除面积较小的连通域_c#opencv 筛选小面积区域-CSDN博客 但是没有对应opencvsharp实现同类算法&#xff0c;为了照顾懂C#编程同学们&#xff0c;因此将 去除面积较小的连通域算法转成C#代码。 方…...

联邦学习目前面临的挑战以及解决方案

学习目标&#xff1a; 联邦学习目前面临的挑战以及解决方案 学习内容&#xff1a; 联邦学习是一种新兴的人工智能基础技术&#xff0c;它在保障大数据交换时的信息安全、保护终端数据和个人数据隐私、保证合法合规的前提下&#xff0c;在多参与方或多计算结点之间开展高效率的…...

Day60:WEB攻防-XMLXXE安全无回显方案OOB盲注DTD外部实体黑白盒挖掘

目录 XML&XXE-传输-原理&探针&利用&玩法 XXE 黑盒发现 XXE 白盒发现 XXE修复防御方案 有回显 无回显 XML&XXE-黑盒-JSON&黑盒测试&类型修改 XML&XXE-白盒-CMS&PHPSHE&无回显 知识点&#xff1a; 1、XXE&XML-原理-用途&…...

Spark 之 入门讲解详细版(1)

1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室&#xff08;Algorithms, Machines, and People Lab&#xff09;开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目&#xff0c;8个月后成为Apache顶级项目&#xff0c;速度之快足见过人之处&…...

进程地址空间(比特课总结)

一、进程地址空间 1. 环境变量 1 &#xff09;⽤户级环境变量与系统级环境变量 全局属性&#xff1a;环境变量具有全局属性&#xff0c;会被⼦进程继承。例如当bash启动⼦进程时&#xff0c;环 境变量会⾃动传递给⼦进程。 本地变量限制&#xff1a;本地变量只在当前进程(ba…...

通过Wrangler CLI在worker中创建数据库和表

官方使用文档&#xff1a;Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后&#xff0c;会在本地和远程创建数据库&#xff1a; npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库&#xff1a; 现在&#xff0c;您的Cloudfla…...

基于服务器使用 apt 安装、配置 Nginx

&#x1f9fe; 一、查看可安装的 Nginx 版本 首先&#xff0c;你可以运行以下命令查看可用版本&#xff1a; apt-cache madison nginx-core输出示例&#xff1a; nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...

条件运算符

C中的三目运算符&#xff08;也称条件运算符&#xff0c;英文&#xff1a;ternary operator&#xff09;是一种简洁的条件选择语句&#xff0c;语法如下&#xff1a; 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true&#xff0c;则整个表达式的结果为“表达式1”…...

Golang dig框架与GraphQL的完美结合

将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用&#xff0c;可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器&#xff0c;能够帮助开发者更好地管理复杂的依赖关系&#xff0c;而 GraphQL 则是一种用于 API 的查询语言&#xff0c;能够提…...

WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)

一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解&#xff0c;适合用作学习或写简历项目背景说明。 &#x1f9e0; 一、概念简介&#xff1a;Solidity 合约开发 Solidity 是一种专门为 以太坊&#xff08;Ethereum&#xff09;平台编写智能合约的高级编…...

BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践

6月5日&#xff0c;2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席&#xff0c;并作《智能体在安全领域的应用实践》主题演讲&#xff0c;分享了在智能体在安全领域的突破性实践。他指出&#xff0c;百度通过将安全能力…...

网站指纹识别

网站指纹识别 网站的最基本组成&#xff1a;服务器&#xff08;操作系统&#xff09;、中间件&#xff08;web容器&#xff09;、脚本语言、数据厍 为什么要了解这些&#xff1f;举个例子&#xff1a;发现了一个文件读取漏洞&#xff0c;我们需要读/etc/passwd&#xff0c;如…...

脑机新手指南(七):OpenBCI_GUI:从环境搭建到数据可视化(上)

一、OpenBCI_GUI 项目概述 &#xff08;一&#xff09;项目背景与目标 OpenBCI 是一个开源的脑电信号采集硬件平台&#xff0c;其配套的 OpenBCI_GUI 则是专为该硬件设计的图形化界面工具。对于研究人员、开发者和学生而言&#xff0c;首次接触 OpenBCI 设备时&#xff0c;往…...