C++ class传值和传引用的详细介绍
在 C 中class类对象的传值和传引用是两种截然不同的参数传递方式它们在性能、内存管理和行为上有着本质的区别。简单来说传值是“复制一份”传引用是“取个别名”。以下是详细的对比分析1. 核心区别概览表格特性传值传引用 ()机制创建对象的副本(拷贝)对象的别名(直接操作原对象)修改影响函数内修改不影响外部对象函数内修改直接影响外部对象性能开销高(需调用拷贝构造函数)低(无拷贝仅传递地址)内存占用占用双倍内存 (原对象副本)几乎不占额外内存安全性高 (外部数据受保护)较低 (外部数据可能被意外修改)多态性会导致对象切片(丢失派生类信息)支持多态(保留完整信息)2. 深入解析 传值当你按值传递一个类对象时C 会调用该类的拷贝构造函数来创建一个完全独立的副本。优点数据安全函数内部无论怎么折腾都不会影响原始数据。语义清晰适合传递小型对象或不需要修改的场景。缺点性能差如果类很大包含大量成员变量或动态内存拷贝操作非常耗时。对象切片如果传递的是派生类对象给基类形参派生类特有的部分会被“切掉”导致多态失效。 传引用传递引用实际上是传递对象的内存地址但在语法上看起来像直接操作变量。优点高性能没有拷贝开销无论对象多大传递效率都一样高。支持多态可以传递派生类对象给基类引用正确调用虚函数。修改原值允许函数直接修改调用者的数据如果需要的话。缺点副作用风险如果不小心可能会意外修改外部数据。3. 代码示例12345678910111213141516171819202122232425262728293031323334353637383940414243444546#include iostream#include string#include vectorclassStudent {public:std::string name;intage;Student(std::string n,inta) : name(n), age(a) {}// 拷贝构造函数用于演示传值时的拷贝行为Student(constStudent other) : name(other.name), age(other.age) {std::cout [拷贝构造函数被调用] std::endl;}};// --- 1. 传值 ---// 这里的 s 是 originalStudent 的副本voidmodifyByValue(Student s) {s.name Modified_Value;s.age 99;std::cout 函数内(值): s.name , s.age std::endl;}// --- 2. 传引用 (非常用) ---// 这里的 s 是 originalStudent 的别名voidmodifyByReference(Student s) {s.name Modified_Reference;s.age 88;std::cout 函数内(引用): s.name , s.age std::endl;}// --- 3. 常量引用 (最佳实践) ---// 既避免了拷贝又防止了修改voidprintStudent(constStudent s) {// s.name Error; // 编译错误不能修改 const 对象std::cout 函数内(只读): s.name , s.age std::endl;}intmain() {Student originalStudent(Alice, 20);std::cout 原始数据: originalStudent.name , originalStudent.age std::endl;std::cout --- 调用传值函数 --- std::endl;modifyByValue(originalStudent);// originalStudent 未被修改但触发了拷贝构造std::cout 调用后: originalStudent.name , originalStudent.age std::endl std::endl;std::cout --- 调用传引用函数 --- std::endl;modifyByReference(originalStudent);// originalStudent 被修改了std::cout 调用后: originalStudent.name , originalStudent.age std::endl;return0;}4. 什么时候用哪个最佳实践在实际开发中请遵循以下规则首选const引用 (const ClassName obj)场景绝大多数情况。当你只需要读取对象数据不需要修改它时。理由避免了昂贵的拷贝开销同时保证了数据安全不会被函数修改。例子void printData(const std::vectorint data);次选非const引用 (ClassName obj)场景当你需要在函数内部修改对象状态时。理由高效且意图明确调用者知道数据会被改。例子void updateConfig(Config cfg);最后传值 (ClassName obj)场景对象非常小如只包含 1-2 个int的类。你确实需要一个副本并且要在函数内随意修改而不影响原对象。注意对于像std::vector、std::string或大型自定义类永远不要按值传递。

相关新闻

恋活HF Patch补丁怎么装?200+插件一键解锁汉化、去码与场景创作

恋活HF Patch补丁怎么装?200+插件一键解锁汉化、去码与场景创作

恋活HF Patch补丁怎么装?200插件一键解锁汉化、去码与场景创作 【免费下载链接】KK-HF_Patch Automatically translate, uncensor and update Koikatu! and Koikatsu Party! 项目地址: https://gitcode.com/gh_mirrors/kk/KK-HF_Patch 你是不是也遇到过&…

2026/10/19 5:39:11 阅读更多 →
C++引用概念及用法全解

C++引用概念及用法全解

一、什么是引用&#xff1f;引用是C中的一种语法特性&#xff0c;可以理解为变量的别名。引用本身不占用独立的内存空间&#xff0c;它和被引用的变量共享同一块内存。引用的基本用法123456789101112int main() {int a 10;int& ra a; // ra是a的别名a 10;cout <<…

2026/10/16 8:34:24 阅读更多 →
Navicat无限试用终极指南:免费开源脚本,三步告别 14 天倒计时

Navicat无限试用终极指南:免费开源脚本,三步告别 14 天倒计时

Navicat无限试用终极指南&#xff1a;免费开源脚本&#xff0c;三步告别 14 天倒计时 【免费下载链接】navicat_reset_mac navicat mac版无限重置试用期脚本 Navicat Mac Version Unlimited Trial Reset Script 项目地址: https://gitcode.com/gh_mirrors/na/navicat_reset_m…

2026/10/16 11:59:03 阅读更多 →

最新新闻

VS2019快速集成wxWidgets二进制包实战指南

VS2019快速集成wxWidgets二进制包实战指南

1. 项目概述&#xff1a;为什么“直接使用二进制文件”是wxWidgets开发中最常被卡住的第一关 在Visual Studio 2019环境下配置wxWidgets&#xff0c;绝大多数人踩进的第一个坑&#xff0c;不是代码写错&#xff0c;也不是逻辑出问题&#xff0c;而是——连编译都过不去。你下载…

2026/10/20 11:33:30 阅读更多 →
AI芯片设计黑盒困局:从不可解释到可控黑盒的工程实践

AI芯片设计黑盒困局:从不可解释到可控黑盒的工程实践

“AI 在芯片领域依然是个黑盒。”这句话不是我从某篇报告里抄来的&#xff0c;是我在上一个流片项目的复盘会上&#xff0c;被自己的算法同事一句一句追问出来的。当时我们上线了一个辅助布局优化的AI模型&#xff0c;指标提升很漂亮&#xff0c;可一旦被问到“为什么这几百个标…

2026/10/20 11:33:30 阅读更多 →
HTC Vive OpenVR 配置避坑指南:SDK 1.25.4 + SteamVR 1.26.4 黄金组合

HTC Vive OpenVR 配置避坑指南:SDK 1.25.4 + SteamVR 1.26.4 黄金组合

简介&#xff1a;本资源是面向VR开发初学者与进阶者的OpenVR实战入门项目&#xff0c;聚焦HTC Vive设备的API调用与Tracker扩展应用&#xff0c;解决开发者在跨平台VR交互开发中接口适配难、追踪数据解析复杂等实际问题。压缩包共9个文件&#xff0c;含4个核心Python脚本&#…

2026/10/20 11:33:30 阅读更多 →
Llama 3 精读:FP8 量化与长上下文实测经验分享

Llama 3 精读:FP8 量化与长上下文实测经验分享

1. 为什么值得花时间精读 Llama 3Llama 3 发布之后&#xff0c;我身边不少做推理部署和模型微调的朋友都在第一时间拉取了权重做实测。大家最关心的其实不是榜单上的分数&#xff0c;而是两个非常实际的问题&#xff1a;第一&#xff0c;这个模型在FP8 量化之后精度到底掉多少&…

2026/10/20 11:33:30 阅读更多 →
腾讯广告回收业务推广类目梳理:可投品类、禁投品类及资质要点

腾讯广告回收业务推广类目梳理:可投品类、禁投品类及资质要点

前言很多再生资源、回收行业的从业者&#xff0c;会选择腾讯广告&#xff08;朋友圈、视频号、腾讯新闻等流量位&#xff09;来收集 B 端企业或 C 端散户的业务咨询信息。但回收类目细分多、监管差异大&#xff0c;不少商家开户后遇到广告拒审、计划下架、账户限流等问题。多数…

2026/10/20 11:33:30 阅读更多 →
专科生论文降AI率实战指南:九款降AIGC工具测评与避坑要点

专科生论文降AI率实战指南:九款降AIGC工具测评与避坑要点

最近后台问得最多的不是论文怎么写&#xff0c;而是“论文写完了AI率太高怎么办”。很多专科生现在交课程论文、毕业设计、实习报告之前&#xff0c;都要先跑一遍AIGC检测&#xff0c;结果一出来就慌了&#xff1a;明明是自己查阅资料写的初稿&#xff0c;只是用AI帮忙润了润色…

2026/10/20 11:32:30 阅读更多 →

日新闻

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
ESP32舵机控制指南:原理、多路驱动与避坑实战

ESP32舵机控制指南:原理、多路驱动与避坑实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
位移法实现一阶低通滤波:单片机ADC采样降噪实战

位移法实现一阶低通滤波:单片机ADC采样降噪实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型&#xff08;GMM&#xff09;的语音识别系统&#xff0c;很多人第一反应就是一堆数学公式&#xff0c;觉得门槛很高。但如果你真的在MATLAB里把它落地跑通&#xff0c;会发现核心其实就是三件事&#xff1a;把声音变成特征向量&#xff0c;用GMM给每个类别…

2026/10/20 10:02:13 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人&#xff0c;但落到具体操作上&#xff0c;无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程&#xff1a;对图像做反白、改调色板、彩色转灰度&#xff0c;最后把像素数据导出成txt文件。单看每一…

2026/10/19 17:32:41 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词&#xff0c;你会发现一个很有意思的现象&#xff1a;每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型&#xff0c;有人指的是运动控制系统&#xff0c;还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 10:02:08 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:45 阅读更多 →