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

cpp类和对象详细讲解(下)

前言:

今天的很多内容也是很重要的,也是需要好好学的,话不多说,开始今天的内容分享。

正文:

首先我们来讲一个比较难理解的函数

拷贝构造函数(重点加难点)

拷贝构造函数是一种特殊的构造函数,用于通过已有对象初始化一个新对象。当发生对象拷贝时(如传值、返回对象或显式拷贝),拷贝构造函数会被自动调用
我们先看下面的代码:
拷⻉构造函数的第⼀个参数必须是类类型对象的引⽤,使⽤传值⽅式编译器直接报错,因为语法逻
辑上会引发⽆穷递归调⽤。 拷⻉构造函数也可以多个参数,但是第⼀个参数必须是类类型对象的引
⽤,后⾯的参数必须有缺省值。
拷⻉构造函数的第⼀个参数必须是类类型对象的引⽤****,使⽤传值⽅式编译器直接报错,因为语法逻辑上会引发⽆穷递归调⽤。 拷⻉构造函数也可以多个参数,但是第⼀个参数必须是类类型对象的引⽤,后⾯的参数必须有缺省值

由上面的定义我们可以知道,拷贝构造是构造函数的一种特殊的形式,所以他的函数名还是一样的,区别是什么呢?
区别主要是拷贝构造的第一个参数必须是类对象的引用,当然也可以多参数(一般不需要)。我相信很多人有疑问为什么拷贝构造的第一个参数是类对象的引用呢?下面给你进行解惑。


下面这个是解释:

所以我们的第一个参数必须是类对象的引用,如果不是引用的话,编译器也是会报错的。

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

当然我们可以知道浅拷贝在一些情况之下是不满足我们的使用的,比如说我们需要申请资源的时候,以及需要深拷贝的时候。



还有就是传值传参是需要开辟栈的空间的,但是传引用的时候并没有这个,会更加的容易。

运算符重载(重点)

运算符重载允许为自定义类型(如类或结构体)重新定义运算符的行为,使其支持类似内置类型的操作方式。通过重载运算符,可以使代码更直观、简洁。
首先看下面的这个代码


运算符重载是具有特殊名字的函数,他的名字是由operator和后⾯要定义的运算符共同构成。和其他函数⼀样,它也具有其返回类型参数列表以及函数体

运算符重载的限制:
1. 不能创造新运算符
只能重载 C++ 已有运算符,不能自己发明:像@、$ 等都不行。
2. 这 5 个运算符不能重载
:: 作用域解析
. 成员访问
.* 成员指针访问
?: 三目运算符
sizeof (不是运算符,也不能重载)
3. 不能改变运算符优先级、结合性、操作数个数
二元运算符不能改成一元
优先级还是原来那样,不会因为你重载就变
4. 以下运算符只能重载为成员函数
= 赋值
() 函数调用
[] 下标
-> 成员访问指针
原因:C++ 语法强制,防止语义混乱。
5. 以下运算符建议重载为全局函数(友元)
<<、>> 流输入输出
对称运算符:+、-、*、/、==、!= 等

为什么要将他们定义为全局函数呢?下面给大家两个代码看一下就知道原因了。



如果外面在类里面定义的话我们可以看到这个,运算符与类变量之间"倒反天罡"了,所以是不可以这样定义的,正确的定义方式是这样的:


我们把他们定义为全局函数就可以跟正常形式是相同的,所以要将他们定义为全局函数。在下面这个代码中我使用了friend与const这两个个关键字,那么我们下面来讲这个两个。

const的使用

在 C++ 中,const 是用于定义常量的关键字,表示变量的值不可被修改。它可以应用于变量、函数参数、函数返回值以及成员函数,增强代码的安全性和可读性。

1. const 修饰变量
变量只读,不能修改。
必须初始化,不能后面赋值。


2.const 修饰指针(重点)


3. const 修饰成员函数

表示不会修改成员变量
const 对象只能调用 const 成员函数
普通成员函数不能被 const 对象调用

4. const 对象

不能修改成员变量
只能调用 const 成员函数

5. 形参尽量用 const &

避免拷贝
保证不修改实参
能接收 const 对象和普通对象

6. 返回值用 const
一般用于防止返回值被修改
运算符重载(如 +、*)常用 const 避免 a+b=c 这种怪异写法

7. 不能随便去掉 const
const 赋值给非 const 是错误的
非要改只能用 const_cast,但尽量别用

友元(容易理解)

友元(Friend)是C++中的一种机制,允许非成员函数或类访问另一个类的私有(private)或保护(protected)成员。通过友元声明,可以打破封装性,但需谨慎使用以避免破坏代码的模块化。

外部友元函数可访问类的私有和保护成员,友元函数仅仅是⼀种声明,他不是类的成员函数。 我们要记住这一点。
然后还有一个点是,友元是单向的且不具备传递性,不能A是B的友元,B又是C的友元就说明A也是C的友元。单向就是说A是B的友元,但是B不是A的友元。

⼀个函数可以是多个类的友元函数,这个是没有限制的。

友元函数可以在类定义的任何地⽅声明,不受类访问限定符限制。


就像这样两个地方都可以声明的。

讲了这么多,我们还没讲他的作用下面给大家举一些作用。
友元的作用:
1.打破类的封装让外部函数或外部类,可以直接访问本类的 private / protected 成员。2.提高代码效率不用通过一堆 get/set 接口间接访问,直接读写成员变量。
3.方便运算符重载像 <<、>> 这种左操作数不是当前类对象的运算符,必须用友元才能实现正常写法:cout << d。
4.让多个类之间协作更方便比如两个类关系紧密、需要频繁互相访问私有数据时使用。

static成员

在C++中,static成员属于类本身而非类的实例。这意味着无论创建多少个类的对象,static成员只有一份拷贝,被所有对象共享。static成员可以是变量或函数。

⽤static修饰的成员函数,称之为静态成员函数,静态成员函数没有this指针

static成员属于整个类,不属于某一个对象,所有对象共享同一份。

static修饰的成员变量必须在类外面初始化
**
**

静态成员函数中可以访问其他的静态成员,但是不能访问⾮静态的,因为没有this指针。

就是这个样子的,他只可以访问静态的成员。与他相对的还有非静态的。
⾮静态的成员函数,可以访问任意的静态成员变量和静态成员函数。

静态成员也是类的成员,受public、protected、private 访问限定符的限制。

静态成员变量不能在声明位置给缺省值初始化,因为缺省值是个构造函数初始化列表的,静态成员变量不属于某个对象,不⾛构造函数初始化列表

这个是错误的,必须在类外面初始化

内部类

如果⼀个类定义在另⼀个类的内部,这个内部类就叫做内部类。内部类是⼀个独⽴的类,跟定义在全局相⽐,他只是受外部类类域限制和访问限定符限制,所以外部类定义的对象中不包含内部类。

在一个类的内部定义的另一个类,叫作内部类,外部的叫外部类。
内部类可以直接访问外部类私有成员。


外部类不能直接访问内部类私有成员,在这里的意思是Inner是不可以访问Outer的私有成员的。这里是不是跟友元很相似,所以内部类天生是外部类的友元。
内部类对象和外部类对象相互独立
所以内部类 = 外部类的天然友元,能访问外部类所有成员,但必须通过外部对象访问,不能直接写变量名。


static修饰的变量则是可以被内部类直接访问的,不需要间接访问的。

今天的分享就到这里,感谢大家的观看。

http://www.jsqmd.com/news/577607/

相关文章:

  • BGP知识点解析
  • Apollo6.0 Lattice算法实战解析——从轨迹组合到最优路径生成
  • 云手机 咸鱼之王搬砖指南
  • OpenCV透视变换实战:从文档矫正到AR应用
  • DeepSeek+Whisper双引擎:零基础实现视频双语字幕自动生成【实战指南】
  • 桌面分区管理:用NoFences打造高效有序的Windows工作空间
  • 2025届最火的AI写作平台横评
  • Betaflight 2025.12实战指南:Azure RTOS重构如何让无人机飞控性能飙升30%
  • rcrack使用教程
  • 保姆级教程:手把手教你用VMware虚拟机安装国产麒麟V10系统(附镜像下载与常见问题解决)
  • 西安geo王尘宇-DeepSeek排名如何做
  • RuleAppv2版本,常见使用问题和解决办法
  • Chord视觉定位效果可视化:边界框[x1,y1,x2,y2]坐标绘制与尺寸校验教程
  • 从内置函数到自定义算法:用 AMDP 驱动的 CDS Scalar Function 打开 ABAP CDS 的新扩展面
  • ElementPlus 3.0.0 升级指南:告别 type.text,拥抱 link 新特性
  • 告别上位机!纯FPGA实现exFAT文件系统,让你的高速数据直接存成标准文件
  • HarmonyOS APP<玩转React>开源教程二十八:搜索功能实现
  • 突破限制!3步实现抖音直播回放的高效下载解决方案
  • 2026广东中古风家具定制优质品牌推荐:佛山家具/佛山布艺沙发/佛山沙发/佛山软床/全屋家具/劳伦斯沙发/选择指南 - 优质品牌商家
  • 如何为《以撒的结合:悔改》安装REPENTOGON扩展框架
  • 深入解析DW_apb_i2c与TMP75的寄存器交互:从配置到温度读取
  • 阿里巴巴 P6 Java 面试全流程实录:高并发实战与 Redis Lua 深度解析
  • 3.Blender甜甜圈添加材质+纹理
  • CSDN 程序员真实变现路径:能长期赚到钱的,其实就这几条路
  • 从package.xml到CMakeLists.txt:手把手教你配置一个ROS1机器人控制包(附完整项目模板)
  • 财务知识-财务分析报告流程 - 智慧园区
  • 阿里云百炼平台免费Token领取攻略:手把手教你用通义千问和DeepSeek(附100万额度)
  • 计算机毕业设计:Python二手车市场数据可视化与智能选购系统 Flask框架 requests爬虫 协同过滤推荐算法 可视化 汽车之家 机器学习(建议收藏)✅
  • Spring Boot 3.x 开发中速率限制集成实现详解
  • Load-Use冒险避坑指南:为什么你的RISC流水线转发电路会失效?