C++面向对象详解(上)

类的定义

class 类名{

//成员变量

//成员方法

}

C++实现的第一个小案例

通过这个案例我们可以了解到C++独有的特点,优点:方法和变量放在了一起,优化了代码的调用,如果在C语言中我们函数调用还要写上函数的返回类型,在C++中,类名就是返回类型,只需要,对象实例化后,就可以直接调用。

#include<iostream>
using namespace std;
class student {//成员变量一般是私有
private:int math_sorce;int Chinese_sorce;int English_sorce;//方法一般是公有
public:int add(int math, int Chinese, int English){int add = math + Chinese + English;return add;}
};
int main()
{//对象的实例化student s1;int sum=s1.add(89, 99, 60);cout << sum << endl;
}

对象的实例化 

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

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

未实例化通过类域调用的错误案例

this指针

this指针是一个用来区分不同成员函数的调用,编译器编译后,类的成员函数默认都会在形参第⼀个位置,增加⼀个当前类类型的指针,叫做this 指针。

void Init(类名* const this, int year, int month, int day) 

类的成员函数中访问成员变量,本质都是通过传递this指针访问的

C++规定不能在实参和形参的位置显示的写this指针(编译时编译器会处理)但是可以在函数体内显示使用this指针

this指针类型面试题

此题,可以传入的是一个空指针,成员变量前会有一个默认的this指针,此题传入的是一个空指针,对空指针中的变量进行解引用会造成程序崩溃。

访问限定符

访问限定符分为:public,protected和private这三个,public修饰的成员在类外可以直接被访问,protected和private修饰的成员在类外不能直接被访。⼀般成员变量都会被限制private/protected,需要给别⼈使⽤的成员函数会放为public。

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

class定义成员没有被访问限定符修饰时默认为private,在C++中struct可以升级类,在类中可以定义函数,struct默认为public

类的默认成员函数

构造函数

构造函数是特殊的成员函数,需要注意的是,构造函数虽然名称叫构造,但是构造函数的主要任务并不是开空间创建对象,而是对象实例化时初始化对象。构造函数的本质是完成初始化工作。

构造函数的特点:

//无参构造

类名 ()

{

}

//有参构造

类名(参数类型 参数)

{

}

1. 函数名与类名相同。

2. 无返回值。

3. 对象实例化时系统会自动调用对应的构造函数。

4. 构造函数可以重载(一般可以提供一个全缺省的构造函数)。

5. 如果类中没有显式定义构造函数,则C++编译器会⾃动⽣成⼀个⽆参的默认构造函数,⼀旦用户显式定义编译器将不再生成。

6. 无参构造函数、全缺省构造函数、我们不写构造时编译器默认生成的构造函数,都叫做默认构造函 数。但是这三个函数有且只有⼀个存在,不能同时存在。

7. 编译器默认生成的构造,对内置类型成员变量的初始化没有要求,也就是说是是否初始化是不确定的,看编译器。对于自定义类型成员变量,要求调用这个成员变量的默认构造函数初始化。

析构函数

析构函数与构造函数功能相反,析构函数不是完成对对象本身的销毁,C++规定对象在销毁时会自动调用析构函数,完成对象中资源的清理释放工作。

析构函数的特点

1. 析构函数名是在类名前加上字符~

2. 无参数无返回值。

3. ⼀个类只能有⼀个析构函数。若未显式定义,系统会⾃动⽣成默认的析构函数。

4. 对象生命周期结束时,系统会自动调用析构函数。

5. 跟构造函数类似,我们不写编译器自动生成的析构函数对内置类型成员不做处理,自定类型成员会调用他的析构函数。

6. 还需要注意的是我们显示写析构函数,对于自定义类型成员也会调用他的析构,也就是说自定义类 型成员无论什么情况都会自动调用析构函数。

7. 如果类中没有申请资源时,析构函数可以不写,直接使⽤编译器生成的默认析构函数。

8. ⼀个局部域的多个对象,C++规定后定义的先析构

总结:析构和构造类似与栈与队列中的函数的初始化和销毁

拷贝构造

拷贝构造

#include<iostream>
using namespace std;
class Date
{
public:Date(int year = 1, int month = 1, int day = 1){_year = year;_month = month;_day = day;}Date(const Date& d){_year = d._year;_month = d._month;_day = d._day;}
private:int _year;int _month;int _day;
};
int main()
{Date d1(2024, 7, 5);
//拷贝构造Date d2(d1);Date d3=d1;
}

⼀个构造函数的第⼀个参数是自身类类型的引⽤,且任何额外的参数都有默认值,则此构造函数 也叫做拷贝构造函数,也就是说拷贝构造是⼀个特殊的构造函数。使用同类对象初始化创建对象

拷贝构造的特点

1. 拷贝构造函数是构造函数的⼀个重载。

2. 拷贝构造函数的第⼀个参数必须是类类型对象的引用,拷贝构造函数也可以多个参数,但是第⼀个参数必须是类类型对象的引用,后面的参数必须有缺省值。

为什么必须是类类型对象的引用?

因为在c++编译器调用的时候,当进行传值传参时,传值传参是一种拷贝就会引发拷贝构造,这样就会引发无限递归调用的情况。当使用引用的时候就会取别名,不会引发拷贝构造。

传值调用时的循环现象

注意:权限访问问题,前面我们说过,传值传参返回值是一块临时对象,这里是只读,到拷贝构造里面变成读和写,访问权限被放大了,因此要记得加上const关键字。

 

3. 若未显式定义拷贝构造,编译器会生成自动生成拷贝构造函数。自动生成的拷贝构造对内置类型成员变量会完成值拷贝/浅拷贝(⼀个字节⼀个字节的拷贝),对自定义类型成员变量会调⽤他的拷贝构造。

深拷贝与浅拷贝的区别:对于栈这中的值拷贝/浅拷贝都是不行的,因为里面涉及到了指针的指向和空间中的资源。

当我们不写拷贝构造的时候,会调用默认构造,但是我们要搞清楚,默认构造是值拷贝,值拷贝对于栈这种情况就是不满足,我们要自己写深拷贝。

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

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

相关文章

手把手教你对接旺店通旗舰版API拉取国内电商店铺订单数据

前言 做国内电商的公司通常会使用比如旺店通这类ERP拉取和分析自己店铺的订单数据&#xff0c;并且可能需要进一步将ERP的订单数据拉取到公司自己做的后台做更个性化的数据分析和需求。这篇博客我以旺店通旗舰版为例&#xff0c;讲解如何通过他们API拉取订单数据到本地。 准备…

热点王炸模型!准确率高达100%!Transformer+GASF+RP-1D-2D-GRU 小白也能发一区!创新性拉满!

适用平台&#xff1a;Matlab2023b版及以上 参考文献一&#xff1a;中文EI期刊 《西安交通大学学报》 文献&#xff1a;《采用格拉姆角场-卷积神经网络-时序卷积网络混合模型的锂离子电池健康状态估计》中的①时序图像融合模型&#xff1b;②一维时序转格拉姆角场模型。参考文献…

如何用 Typed.js 制作炫酷的打字效果?

前言 在前端开发的世界中&#xff0c;动态和交互性是用户体验的关键。 Typed.js 是一个轻量级的 JavaScript 库&#xff0c;它能够以编程方式模拟打字效果&#xff0c;为网页增添动态的文本展示。 这篇文章将带你深入了解 Typed.js 的魔力&#xff0c;探索它如何为前端开发带…

【PyTorch】深入解析 `with torch.no_grad():` 的高效用法

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 文章目录 引言一、with torch.no_grad(): 的作用二、with torch.no_grad(): 的原理三、with torch.no_grad(): 的高效用法3.1 模…

IOS 21 发现界面(UITableView)单曲列表(UITableView)实现

发现界面完整效果 本文实现歌单列表效果 文章基于IOS 20 发现界面&#xff08;UITableView&#xff09;歌单列表&#xff08;UICollectionView&#xff09;实现 继续实现发现界面单曲列表效果 单曲列表Cell实现 实现流程&#xff1a; 1.创建Cell&#xff0c;及在使用UITable…

如何使用 Mistral 和 Llama2 构建 AI 聊天机器人

开始使用 Mistral 让我们从 Mistral 7B Instruct 的 GGUF 量化版本开始&#xff0c;并使用 AutoClasses ‘AutoModelForCausalLM’ 之一来加载模型。AutoClasses 可以帮助我们自动检索给定模型路径的模型。AudoModelForCausalLM 是具有因果语言建模的模型类之一&#xff0c;这…

【STM32+HAL库】---- 驱动DHT11温湿度传感器

硬件开发板&#xff1a;STM32F407VET6 软件平台&#xff1a;cubemaxkeilVScode1 DHT11工作原理 1.1 简介 DHT11温湿度传感器是一种数字式温湿度传感器&#xff0c;其工作原理基于集成了湿度感测元件和NTC温度感测元件的传感器模块。以下是DHT11温湿度传感器的工作原理&#x…

SQL - SQL优化

在sql查询中为了提高查询效率&#xff0c;我们常常会采取一些措施对查询语句进行sql优化&#xff0c;下面总结的一些方法&#xff0c;有需要的可以参考参考 一、查询SQL尽量不要使用select *&#xff0c;而是具体字段 // 建议 SELECT id,user_name,age,tel FROM user// 不建议…

同城便民信息生活小程序源码系统 求职招聘+房产出租+相亲交友 带完整的安装代码包以及搭建部署教程

系统概述 同城便民信息生活小程序源码系统是一款专为满足城市居民多元化需求而设计的综合性服务平台。该系统通过整合求职招聘、房产出租、相亲交友等核心功能模块&#xff0c;旨在打造一个集信息发布、查询、交流于一体的闭环生态系统。用户可以在小程序内轻松发布或浏览各类…

【STM32+HAL库】---- 驱动MAX30102心率血氧传感器

硬件开发板&#xff1a;STM32F407VET6 软件平台&#xff1a;cubemaxkeilVScode1 MAX30102心率血氧传感器工作原理 MAX30102传感器是一种集成了红外光源、光电检测器和信号处理电路的高度集成传感器&#xff0c;主要用于心率和血氧饱和度的测量。以下是MAX30102传感器的主要特点…

使用光敏电阻设计照度计

照度计是一种使用 SI 单位勒克斯测量照度和光发射度的设备。它有效地测量落在给定面积单位上的光的功率量&#xff0c;不同之处在于功率测量被加权以反映人眼对不同波长的光的敏感度。描述照度计的一种更简单的方法是&#xff0c;它测量落在传感器上的光的亮度。市售照度计的价…

使用PyTorch从零构建Llama 3

我们上次发了用PyTorch从零开始编写DeepSeek-V2的文章后&#xff0c;有小伙伴留言说希望介绍一下Llama 3。那么今天他就来了&#xff0c;本文将详细指导如何从零开始构建完整的Llama 3模型架构&#xff0c;并在自定义数据集上执行训练和推理。 [图1]&#xff1a;Llama 3架构展示…

Linux/Ubuntu服务器 screen 安装与使用

一、screen简单介绍 在Linux系统中&#xff0c;screen是一个非常强大的终端仿真器&#xff0c;它允许用户在一个终端窗口中创建多个子窗口&#xff0c;每个子窗口都可以运行一个独立的会话。screen的主要特点包括&#xff1a; 会话分离&#xff1a;screen允许用户在终端会话中运…

宝宝护眼灯哪个牌子好?2024年热门宝宝护眼灯款式推荐

宝宝护眼灯哪个牌子好&#xff1f;在日常生活的点点滴滴中&#xff0c;适宜的灯光扮演着至关重要的角色&#xff0c;无论是学习还是办公等环境&#xff0c;皆需要恰当的照明。为此&#xff0c;人们通常会备上一款台灯&#xff0c;特别是对于长期与电脑为伴的设计师、影像绘图专…

爆改YOLOv8|利用yolov10的C2fCIB改进yolov8-高效涨点

1&#xff0c;本文介绍 本文介绍了一种改进机制&#xff0c;通过引入 YOLOv10 的 C2fCIB 模块来提升 YOLOv8 的性能。C2fCIB 模块中的 CIB&#xff08;Compact Inverted Bottleneck&#xff09;结构采用了高效的深度卷积进行空间特征混合&#xff0c;并使用点卷积进行通道特征…

【unity知识】Animator动画状态的基本属性介绍

文章目录 动画状态的基本属性1、标签Tag2、Motion 该状态所管理的动画片段3、speed 动画的播放速度4、Motion Time 播放动画片段定在一个特定时间点5、Mirror镜像动画6、CycleOffset动画偏移7、FootIK8、Write Defaults 参考完结 动画状态的基本属性 1、标签Tag 通过打标签我们…

AI大模型时代,产品经理需要了解什么?

在移动互联网高速发展的时代&#xff0c;产品经理一度成为最火爆的职业&#xff0c;人人都想当产品经理&#xff0c;有很多人说&#xff1a;产品经理的上限极高&#xff0c;它应该是CEO式的岗位。事实上&#xff0c;我们看到新型互联网科技公司的CEO也确实都是产品出身。但是这…

数据库审计是什么?主要用在哪些场景呢?

数据库审计是什么&#xff1f;主要用在哪些场景呢&#xff1f; 数据库审计 数据库审计是指对数据库系统中的操作进行记录、监控和分析的过程&#xff0c;用于检查和评估数据库的安全性、合规性和完整性。数据库审计可以为组织提供重要的安全保障和合规性需求的满足。本文将介…

重置vCenter Server的root密码

文章目录 重置vCenter Server的root密码一、vCenter Server 6.7之前的版本步骤&#xff1a; 二、vCenter Server 7.0及之后版本步骤&#xff1a; 注意事项 重置vCenter Server的root密码 在虚拟化环境中&#xff0c;VMware vCenter Server扮演着核心管理角色的重任。然而&…

前端请求的路径baseURL怎么来的 ?nodejs解决cors问题的一种方法

背景&#xff1a;后端使用node.js搭建&#xff0c;用的是express 前端请求的路径baseURL怎么来的 &#xff1f; 前后端都在同一台电脑上运行&#xff0c;后端的域名就是localhost&#xff0c;如果使用的是http协议&#xff0c;后端监听的端口号为3000&#xff0c;那么前端请求…