可以做秋招笔试题的网站/线下实体店如何推广引流

可以做秋招笔试题的网站,线下实体店如何推广引流,自助建站系统注册,网站制作公司网类与对象:深入理解默认成员函数 引言1、默认成员函数概述2、构造函数与析构函数2.1 默认构造函数2.2 析构函数 3、拷贝控制成员3.1 拷贝构造函数3.2 赋值运算符重载 4、移动语义(C11)4.1 移动构造函数4.2 移动赋值运算符 5、三五法则与最佳实…

类与对象:深入理解默认成员函数

  • 引言
  • 1、默认成员函数概述
  • 2、构造函数与析构函数
    • 2.1 默认构造函数
    • 2.2 析构函数
  • 3、拷贝控制成员
    • 3.1 拷贝构造函数
    • 3.2 赋值运算符重载
  • 4、移动语义(C++11)
    • 4.1 移动构造函数
    • 4.2 移动赋值运算符
  • 5、三五法则与最佳实践
    • 5.1 三五法则(Rule of Three/Five)
    • 5.2 显式控制
    • 5.3 建议
  • 6、总结

引言

C语言是面向过程的语言,强调函数和结构化编程,而C++在兼容C语言的基础上,增加了面向对象编程、泛型编程等特性。

  • 典型对比
// C:过程式
typedef struct Stack
{int* a;int top;int capacity;
} Stack;void STInit(Stack* pst);
void STPush(Stack* pst, STDataType x);
// C++:面向对象
class Stack {
public:Stack() {}void push(int x){}
private:int* a_;int size_;int capcity_;
};

1、默认成员函数概述

  • 在C++中,当定义一个类时,编译器会自动生成6个默认成员函数(C++11起):
    • 默认构造函数
    • 析构函数
    • 拷贝构造函数
    • 赋值运算符重载
    • 移动构造函数(C++11)
    • 移动赋值运算符(C++11)
  • 这些函数在特定场景下会被隐式调用,理解它们的特性和行为对编写健壮的类至关重要。

2、构造函数与析构函数

2.1 默认构造函数

  • 作用:初始化对象成员。
  • 生成条件:当类中没有显示定义任何构造函数时。
  • 特点
    • 对内置类型不做处理(不进行初始化)。
    • 对自定义类型调用其默认构造函数。
  • 示例
class A {
public:int x;  // 随机值std::string s; // 调用std::string类的默认构造函数
};int main() {A a;return 0;
}

[!WARNING]

当显示创建构造函数,编译器就不会生成默认构造函数。

class A {
public:A(int x, std::string s) {std::cout << "A" << std::endl;}int x;std::string s;
};int main() {A a;return 0;
}

显示创建构造函数

2.2 析构函数

  • 作用:释放对象资源。
  • 生成条件:没有显示定义析构函数。
  • 特点
    • 内置类型不做处理。
    • 自定义类型调用其析构函数。
class A {
public:A() {std::cout << "A()" << std::endl;}~A() {std::cout << "~A()" << std::endl;}
private:int x;std::string s;
};int main() {A a; // A()// ~A()return 0;
}

[!CAUTION]

当类管理资源(动态内存、文件句柄等)时,必须手动定义。

class Stack {
public:Stack(int n = 4) {a_ = (int*)malloc(sizeof(int) * n);top_ = 0;capacity_ = n;}~Stack() {free(a_);a_ = nullptr;top_ = capacity_ = 0;}
private:int* a_;int capacity_;int top_;
};

3、拷贝控制成员

3.1 拷贝构造函数

  • 形式T(const T& val)
  • 特点
    • 内置类型不做处理,直接进行值拷贝。
    • 自定义类型调用其拷贝构造函数。

[!IMPORTANT]

如果不显示定义拷贝构造函数,编译器默认进行值拷贝。

class Stack {
public:Stack(int n = 4) {a_ = (int*)malloc(sizeof(int) * n);top_ = 0;capacity_ = n;}~Stack() {free(a_);a_ = nullptr;top_ = capacity_ = 0;}
private:int* a_;int capacity_;int top_;
};int main() {Stack s1;Stack s2(s1);return 0;
}
  • 调试可观察到:

浅拷贝

s1对象和s2对象内的数据数组具有相同的地址,表明是同一个。

浅拷贝

3.2 赋值运算符重载

  • 形式T& operator=(const T& val)
  • 示例
class Stack {
public:Stack(int n = 4) {a_ = (int*)malloc(sizeof(int) * n);top_ = 0;capacity_ = n;}Stack(const Stack &s) {a_ = (int*)malloc(sizeof(int) * capacity_);top_ = s.top_;capacity_ = s.capacity_;for (int i = 0; i < top_; ++i) {a_[i] = s.a_[i];}}Stack& operator=(const Stack &s) { // 赋值运算符重载if (this != &s) { // 杜绝自己赋值给自己free(a_); // 将原数组释放,防止内存泄漏a_ = (int*)malloc(sizeof(int) * capacity_);top_ = s.top_;capacity_ = s.capacity_;for (int i = 0; i < top_; ++i) {a_[i] = s.a_[i];}}return *this;}~Stack() {free(a_);a_ = nullptr;top_ = capacity_ = 0;}
private:int* a_;int capacity_;int top_;
};

4、移动语义(C++11)

4.1 移动构造函数

  • 形式T(T&&)
  • 关键:转移资源所有权而非拷贝。
  • 标记:使用noexcept保证异常安全。
class Vector {
public:Vector(int n = 4) {data_ = new int[n];size_ = 0;capacity_ = n;}Vector(Vector&& v) noexcept: data_(v.data_), size_(v.size_), capacity_(v.capacity_) {v.data_ = nullptr;v.size_ = 0;v.capacity_ = 0;}~Vector() {delete[] data_;size_ = capacity_ = 0;}
private:int* data_;int size_;int capacity_;
};

4.2 移动赋值运算符

  • 形式T& operator=(T&&)
Vector& operator=(Vector&& v) noexcept {if (this != &v) {data_ = v.data_;size_ = v.size_;capacity_ = v.capacity_;v.data_ = nullptr;v.size_ = 0;v.capacity_ = 0;}return *this;
}
  • 生成规则
    • 没有自定义拷贝控制成员时。
    • 类未声明移动操作。
    • 析构函数未显示定义。

5、三五法则与最佳实践

5.1 三五法则(Rule of Three/Five)

  • 需要自定义析构函数 ⇒ \Rightarrow 必须处理拷贝(三法则)。
  • C++11后扩展为五法则(包含移动操作)。

5.2 显式控制

  • =default:显示要求编译器生成默认版本。
  • =delete:禁用特定成员函数。

5.3 建议

  • 优先使用移动语义。
  • 使用智能指针管理资源。
  • 默认使用=default保持代码简洁。

6、总结

成员函数默认行为自定义场景
默认构造函数内置类型不做处理,自定义类型调用其默认构造函数需要特定初始化逻辑
析构函数内置类型不做处理,自定义类型调用其默认析构函数管理资源释放
拷贝构造函数浅拷贝需要深拷贝或禁止拷贝
赋值运算符重载浅拷贝同拷贝构造函数
移动构造函数转移资源(C++11)优化资源转移
移动赋值运算符转移资源(C++11)同移动构造函数

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

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

相关文章

QT实现计算器

1&#xff1a;在注册登录的练习里面&#xff0c; 追加一个QListWidget 项目列表 要求&#xff1a;点击注册之后&#xff0c;将账号显示到 listWidget上面去 以及&#xff0c;在listWidget中双击某个账号的时候&#xff0c;将该账号删除 Widget.h #ifndef WIDGET_H #define…

io学习----->标准io

思维导图&#xff1a; 一.io的作用 io是实现对文件的操作&#xff0c;把运行结果存到文件中&#xff0c;读取文件的数据&#xff0c;方便后期查询。 二.io的概念 io是指系统 和外部设备或用户之间的数据交互 I:input 表示数据从外部设备输入到内存中&#xff1b; O:output…

使用消息队列怎样防止消息重复?

大家好&#xff0c;我是君哥。 使用消息队列时&#xff0c;我们经常会遇到一个可能对业务产生影响的问题&#xff0c;消息重复。在订单、扣款、对账等对幂等有要求的场景&#xff0c;消息重复的问题必须解决。 那怎样应对重复消息呢&#xff1f;今天来聊一聊这个话题。 1.三…

解决Docker Desktop启动后Docker Engine stopped问题

一、问题描述 当我们更新了Docker Desktop后,在重新打开就显示【Docker Engine stopped(Docker引擎已经停止)】,无法正常使用Docker,如下图所示: 二、问题分析 1、检查电脑主板的CPU是否开启虚拟化; 2、需检查Docker所需的功能是否开启; 3、检查WSL是否匹配; Docker的…

MongoDB—(一主、一从、一仲裁)副本集搭建

MongoDB集群介绍&#xff1a; MongoDB 副本集是由多个MongoDB实例组成的集群&#xff0c;其中包含一个主节点&#xff08;Primary&#xff09;和多个从节点&#xff08;Secondary&#xff09;&#xff0c;用于提供数据冗余和高可用性。以下是搭建 MongoDB 副本集的详细步骤&am…

蓝桥杯自我复习打卡

总复习&#xff0c;打卡1. 一。排序 1。选段排序 太可恶了&#xff0c;直接全排输出&#xff0c;一个测试点都没过。 AC 首先&#xff0c;这个【l,r】区间一定要包含p,或者q&#xff0c;pq一个都不包含的&#xff0c;[l,r]区间无论怎么变&#xff0c;都对ans没有影响。 其次&…

Flutter_学习记录_实现列表上拉加载更多的功能

可以用ScrollController组件来实现这样列表上拉加载更多的功能: 1. 定义变量 在StatefulWidget 的组件内&#xff0c;添加三个属性&#xff1a; // 滚动视图的控制器final ScrollController _scrollController ScrollController();// 是否已显示了上拉加载中bool _isShowM…

【Linux】【网络】不同子网下的客户端和服务器通信其它方式

【Linux】【网络】不同子网下的客户端和服务器通信其它方式 那么&#xff0c;在 NAT 环境下&#xff0c;应该如何让内网设备做为服务器&#xff0c;使内网设备被外部连接&#xff1f; 1 多拨 部分运营商&#xff0c;支持在多个设备上&#xff0c;通过 PPPoE 登录同一个宽带账…

六十天前端强化训练之第一天到第七天——综合案例:响应式个人博客项目

欢迎来到编程星辰海的博客讲解 目录 前言回顾 HTML5与CSS3基础 一、知识讲解 1. 项目架构设计&#xff08;语义化HTML&#xff09; 2. 响应式布局系统&#xff08;Flex Grid&#xff09; 3. 样式优先级与组件化设计 4. 完整响应式工作流 二、核心代码示例 完整HTML结…

测试的BUG分析

在了解BUG之前,我们要先了解软件测试的生命周期,因为大多数BUG都是在软件测试的过程中被发现的 软件测试的生命周期 在了解 软件测试的生命周期 之前,我们要先了解 软件的生命周期 ,虽然他们之间只差了两个字,但是差距还是很大的 首先是 软件生命周期 ,这个是站在 软件 的角…

【洛谷贪心算法题】P1094纪念品分组

该题运用贪心算法&#xff0c;核心思想是在每次分组时&#xff0c;尽可能让价格较小和较大的纪念品组合在一起&#xff0c;以达到最少分组的目的。 【算法思路】 输入处理&#xff1a;首先读取纪念品的数量n和价格上限w&#xff0c;然后依次读取每件纪念品的价格&#xff0c;…

[STM32]从零开始的STM32 BSRR、BRR、ODR寄存器讲解

一、前言 学习STM32一阵子以后&#xff0c;相信大家对STM32 GPIO的控制也有一定的了解了。之前在STM32 LED的教程中也教了大家如何使用寄存器以及库函数控制STM32的引脚从而点亮一个LED&#xff0c;之前的寄存器只是作为一个引入&#xff0c;并没有深层次的讲解&#xff0c;在教…

SP导入智能材质球

智能材质球路径 ...\Adobe Substance 3D Painter\resources\starter_assets\smart-materials 放入之后就会自动刷新

网络原理----TCP/IP(3)

核心机制七----延时应答 默认情况下&#xff0c;接收方都是在收到数据报的第一时间&#xff0c;就返回ack&#xff0c;但是可以通过延时返回ack的方式来提高效率&#xff0c;理论上不是100%提高效率&#xff0c;但还是有一定帮助的。 因为如果接收数据的主机⽴刻返回ACK应答,…

MacBook Pro使用FFmpeg捕获摄像头与麦克风推流音视频

FFmpeg查看macos系统音视频设备列表 ffmpeg -f avfoundation -list_devices true -i "" 使用摄像头及麦克风同时推送音频及视频流: ffmpeg -f avfoundation -pixel_format yuyv422 -framerate 30 -i "0:1" -c:v libx264 -preset ultrafast -b:v 1000k -…

ubuntu中ollama设置记录

自己同一台电脑主机安装3080和3090显卡&#xff0c;测试发现ollama只默认跑在3090上&#xff1b;故查看一下设置&#xff0c;成功也把3080也运行起来了。 原因如下&#xff1a; 开始设置记录&#xff1a; Environment Variables: OLLAMA_DEBUG 作用&#xff1a;显示额外的调试…

【Python · PyTorch】循环神经网络 RNN(基础应用)

【Python PyTorch】循环神经网络 RNN&#xff08;简单应用&#xff09; 1. 简介2. 模拟客流预测&#xff08;数据集转化Tensor&#xff09;3.1 数据集介绍3.2 训练过程 3. 模拟股票预测&#xff08;DataLoader加载数据集&#xff09;3.1 IBM 数据集3.1.2 数据集介绍3.1.3 训练…

【JSON2WEB】15 银河麒麟操作系统下部署JSON2WEB

【JSON2WEB】系列目录 【JSON2WEB】01 WEB管理信息系统架构设计 【JSON2WEB】02 JSON2WEB初步UI设计 【JSON2WEB】03 go的模板包html/template的使用 【JSON2WEB】04 amis低代码前端框架介绍 【JSON2WEB】05 前端开发三件套 HTML CSS JavaScript 速成 【JSON2WEB】06 JSO…

Spring Boot(七):Swagger 接口文档

1. Swagger 简介 1.1 Swagger 是什么&#xff1f; Swagger 是一款 RESTful 风格的接口文档在线自动生成 功能测试功能软件。Swagger 是一个规范和完整的框架&#xff0c;用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。目标是使客户端和文件系统作为服务器以同样的…

cursor 弹出在签出前,请清理仓库工作树 窗口

问题出现的背景&#xff1a;是因为我有两台电脑开发&#xff0c;提交后&#xff0c;另一个电脑的代码是旧的&#xff0c;这个时候我想拉取最新的代码&#xff0c;就会出现如下弹窗&#xff0c;因为这个代码暂存区有记录或者工作区有代码的修改&#xff0c;所以有冲突&#xff0…