引用语义和值语义

news/2025/3/13 1:46:46/文章来源:https://www.cnblogs.com/ydqblogs/p/18768513

1.引用语义和值语义

  C++同时支持引用语义(reference semantics)值语义(value semantics),并默认使用值语义。

1.1 定义

值语义:指对象在赋值或传递时,进行的是值得复制,每个对象都有自己独立的数据副本,赋值过后,操作源对象和目的对象互不影响。
引用语义:指对象在赋值或传递时,复制的是引用(指针或句柄),而不是实际的类型,因此多个引用可能指向同一个实际对象,通过其中一个引用修改对象时,其他引用也会看到这个变化。

1.2 代码示例

值语义示例

struct Point {int x, y;Point(int x, int y) : x(x), y(y) {}
};void modify(Point p) {p.x = 100;  //修改副本,原对象不会受到任何影响
}int main() {point p1{1, 2};point p2 = p1;    //值拷贝modify(p1);       //p1的值未改变return 0;
}

引用语义示例

class Buffer {std::vector<int> data;
public:void fill(int value) { data.assign(1000, value); }
};void modify(Buffer& buf) {buf.fill(42); // 修改原对象
}int main() {Buffer buf1;Buffer& buf_ref = buf1;  // 引用语义,buf_ref 是 buf1 的别名modify(buf1);            // buf1 的内容被修改
}

  在C++里,使用引用类型一定会得到引用语义,但非引用的类型并不一定以为这值语义,因为使用智能指针(std::shared_ptr)时,虽然智能指针本身是值语义,但是指向的对象是引用语义。也就是说,智能指针的值复制会增加引用计数,但实际指向的对象是共享的。

1.3 关键对比

特性 值语义 引用语义
数据所有权 每个对象拥有独立数据副本 共享同一份数据,无独立副本
默认行为 C++基本类型和类对象的默认行为 需显式使用指针、引用或智能指针
拷贝开销 可能高昂(深拷贝大对象) 无拷贝(传递指针/引用)
修改影响 仅影响副本 影响所有关联引用
典型应用 小型数据、隔离修改需求 大型数据、共享状态、多态

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

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

相关文章

https://www.cnblogs.com/B2205/p/18768998

一、团队介绍 1.1 团队概况 1.1.1 博客展示链接 团队名:师联星 组长博客链接:https://www.cnblogs.com/nurali1508 1.1.2 团队项目描述 项目名称:师联星 定位:大学生家教辅助软件 核心功能:通过智能匹配系统连接学生与家教老师,提供个性化教学方案和课程监督服务。 1.1.3…

皮肤测试

目录Typora 主题测试文档1. 标题样式H3 标题H4 标题H5 标题H6 标题2. 文本格式3. 列表样式无序列表有序列表任务列表4. 代码块5. 表格6. 图片7. 数学公式8. 其他元素水平线引用块脚注空行代码主题 Typora 主题测试文档 1. 标题样式 H3 标题 H4 标题 H5 标题 H6 标题 2. 文本格式…

https://www.cnblogs.com/nurali1508/p/18766565

一、团队介绍 1.1 团队概况 1.1.1 博客展示链接 团队名,组长博客链接https://www.cnblogs.com/nurali1508 1.1.2 团队项目描述 师联星——方便大学生家教的辅助软件 1.1.3 队员风采 努尔艾力 风格:有趣 擅长的技术: 编程的兴趣:安静 希望的软工角色:发言和统计 一句话宣言…

如何调用CMD实现多个同类文件合并的研究 二进制 依次 文本图像视频音频

引言 视频网站内,使用视频下载嗅探器下载了视频,打开资源管理器一看,是几千个.ts文件,见下图: 通过播放部分视频,发现其实内容是完整的,只是自动切割了多份,倘若无缝拼接为一个完整视频单元,就可以正常播放观赏了。 经过考虑,可以使用视频编辑软件,比如PR,导入素材…

师联星

一、团队介绍 1.1 团队概况 1.1.1 博客展示链接 团队名,组长博客链接https://www.cnblogs.com/nurali1508 1.1.2 团队项目描述 师联星——方便大学生家教的辅助软件 1.1.3 队员风采 努尔艾力 风格:有趣 擅长的技术: 编程的兴趣:安静 希望的软工角色:发言和统计 一句话宣言…

【程设の旅】魔兽世界 Part4:终极

写完还是挺累的 主要是那个憨憨四万三千行的数据包 调的人有点晕 而且里面还有三个憨憨四舍五入 搞得人晕乎乎 最后这三个数据只能打表 唉 放代码吧 感觉类与对象封装还是不敢用 等后面自己做个QT项目练一练咯 #include<bits/stdc++.h> #define ll long long using names…

[AIGC/ALM] 增强语言模型(ALM)之综述

1 简介最近Meta发表了一篇图灵奖得主Yann LeCun参与的关于“Augmented Language Models: a Survey/增强语言模型:一篇调查”的综述,系统归纳了语言模型的推理能力以及使用外部工具能力的工作(推理指将复杂任务分解为更简单的子任务,工具包括调用模块等 ),并指出这个方向有可…

Vue3 icon使用

icon使用:https://cn.element-plus.org/zh-CN/component/icon.html 1.安装icon2.配置main.js点击查看代码 import { createApp } from vue import ElementPlus from element-plus import element-plus/dist/index.cssimport App from ./App.vue import router from ./routerim…

第一周实验:已有程序二次开发

一. 来源 代码来源于室友大一期末大作业。该程序模拟实现了一个简易的图书管理系统,功能有用户注册登录,查询,购买书籍,管理员对书籍的增删改查功能。 二.程序原来的代码及运行结果 运行环境:Windows 11 + Visual Studio 2022点击查看代码 #include<iostream> #incl…

知识点系列——基础数据结构

1.1 链表 洛谷-P1996 约瑟夫问题我就直接模拟void solve() {cin>>n>>k;int id=0;for(int i=1;i<=n;i++){int p=0;while(p<k){bool f=false;while(vis[id]){id++;f=1;if(id>n)id=1;}if(!f){id++;if(id>n)id=1;while(vis[id]){id++;if(id>n)id=1;}}p+…

Laravel11 从0开发 Swoole-Reverb 扩展包(七) - 发布laravel-swoole-reverb

开篇 这一篇,我做了过度,因为正好也完成第一个版本的laravel swoole reverb服务。因此,先做个🧐,我们后面还会继续分享整个实现流程。 关于laravel-swoole-reverb laravel-swoole-reverb是一个将 Swoole 与 Laravel Reverb 集成的包,采用php8.2版本编写,可用于高性能的…

TinyWebServer全解

项目地址 原理合集 把链接都放在这里,可以一次看个爽 epoll main 首先是main函数: #include "config.h"int main(int argc, char *argv[]) {//需要修改的数据库信息,登录名,密码,库名string user = "ct";string passwd = "123456";string data…