C++ 值,指针,引用的讨论
源自 stackoverflow 论坛,很有意义
第一个问题,引用传递和按值传递的场合
There are four main cases where you should use pass-by-reference over pass-by-value:
- If you are calling a function that needs to modify its arguments, use pass-by-reference or pass-by-pointer. Otherwise, you’ll get a copy of the argument.
- If you're calling a function that needs to take a large object as a parameter, pass it by const reference to avoid making an unnecessary copy of that object and taking a large efficiency hit.
- If you're writing a copy or move constructor which by definition must take a reference, use pass by reference.
- If you're writing a function that wants to operate on a polymorphic class, use pass by reference or pass by pointer to avoid slicing.
来源:Where should I prefer pass-by-reference or pass-by-value?
int v = 5; cout << v << endl; // prints 5
cout << &v << endl; // prints address of v int* p;
p = &v; // stores address of v into p (p is a pointer to int) int& r = v; cout << r << endl; // prints 5 r = 6; cout << r << endl; // prints 6
cout << v << endl; // prints 6 too because r is a reference to v
问题中更有意思的是对 *this 的解释,
Firstly, this is a pointer. The * dereferences the pointer, meaning return *this; returns the object, not a pointer to it.
Secondly, Test& is returning a reference to a Test instance. In your case, it is a reference to the object. To make it return a pointer, it should be Test*.
来源:Address-of operator (&) vs reference operator(&)
第三个问题,通过引用传递指针的原因
考虑这样的代码,
template<typename T>
void moronic_delete(T*& p)
{
delete p;
p = nullptr;
}
回答:
如果你需要修改指针而不是指针指向的对象,你可能希望通过引用传递指针。(如果没有引用,你只会更改指针的本地副本)
这类似于为什么使用双指针;使用对指针的引用比使用指针稍微安全一些。
附 C++ 各个阶段学习的书籍推荐,来源论坛大牛的回答
C++ 并发编程实战感觉包含挺多工作上需要的知识点,比如,线程库、原子库、C++ 内存模型、锁和互斥锁,以及设计和调试多线程应用程序的问题,可以看看
C++ 值,指针,引用的讨论的更多相关文章
- 【Java】 参数的传递:值传递与引用传递讨论
内容稍多,可直接看第4点的讨论结果 前言 在涉及到传递参数给方法时,容易出现一些参数传递错误的问题,这就涉及到了参数的传递问题,必须搞清楚:参数是如何传递到方法中的?一般来说,参数的传递可以分为两种: ...
- C/C++-左值、右值及引用
目录 1.左值and右值 2.引用 3.左值引用的用途 4.std::move和std::swap C和C++中定义了引用类型(reference type),存在左值引用(lvalue refere ...
- 3.GO-项目结构、包访问权限、闭包和值传递引用传递
3.1.goland中项目结构 (1)在goland中创建标准Go项目 (2)goland配置 创建项目Learn-Go file-settings-go-GOPATH-添加 在项目目录下创建src目 ...
- paip.指针 引用 c++ java的使用总结.
paip.指针 引用 c++ java的使用总结. ///////////////一般一个变量包括下面的信息 a.地址(指针) b.命名(引用,别名) c.变量内容.. 指针是一个变量的地址, ...
- Javascript参数传递中值和引用的一种理解
值(value)和引用(reference)是各种编程语言老生常谈的话题,js也不例外. 我将剖析一个例子的实际运行过程,跟大家分享我对js参数传递中的值和引用的理解. 参考官网数据类型的两种分类,本 ...
- JS中原始值和引用值的储存方式
在ECMAscript中,变量可以存放两种类型的值,即原始值和引用值 原始值指的是代表原始数据类型的值,也叫基本数据类型,包括:Number.Stirng.Boolean.Null.Underfine ...
- C语言学习笔记 (007) - 数组指针和通过指针引用数组元素的方法总结
1.数组指针:即指向数组的指针 那么, 如何声明一个数组指针呢? ]; /*括号是必须写的,不然就是指针数组:10是数组的大小*/ 拓展:有指针类型元素的数组称为指针数组. 2.通过指针引用数组元素的 ...
- Js 中的原始值和引用值
最近遇写 node.js 时到一个问题,把对象当赋值给数组成员时总是出错,比如下面的代码, var Arr = new Array(); var Obj = new Object(); for(var ...
- C++中的二级指针和指针引用函数传参
在函数的使用过程中,我们都明白传值和传引用会使实参的值发生改变.那么能够通过传指针改变指针所指向的地址吗? 在解决这个问题之前,也许我们应该先了解指针非常容易混淆的三个属性: ①.指针变量地址(&am ...
- 引用、数组引用与指针引用、内联函数inline、四种类型转换运算符
一.引用 (1).引用是给一个变量起别名 定义引用的一般格式:类型 &引用名 = 变量名: 例如:int a=1; int &b=a;// b是a的别名,因此a和b是同一个单元 ...
随机推荐
- [转帖]Dockerfile中CMD和ENTRYPOINT命令详解
https://www.jb51.net/article/136264.htm Dockerfile中的ENTRYPOINT指令和CMD指令都可以设置容器启动时要执行的命令,但用途是有略微不同的. ...
- [转帖]TiDB BR 备份至 MinIO S3 实战
https://tidb.net/blog/3a31d41d#3.%E9%83%A8%E7%BD%B2%20MinIO%20S3%20%E5%8F%8A%E5%A4%87%E4%BB%BD%E6%81 ...
- [转帖]针对容器的nginx优化
针对容器的nginx优化 本篇文章介绍了 Nginx 在容器内使用遇到的CPU核数获取问题以及对应的解决方法. 回顾上篇文章:TCP 半连接队列和全连接队列 背景 容器技术越来越普遍,很多公司已经将容 ...
- [转帖]一文读懂容器存储接口 CSI
https://zhuanlan.zhihu.com/p/470093908 作者 | 惠志来源 | 阿里巴巴云原生公众号 导读:在<一文读懂 K8s 持久化存储流程>一文我们重点介绍了 ...
- [转帖]fio工具中的iodepth参数与numjobs参数-对测试结果的影响
测试环境 3台服务器:ceph配置内外网分离,外网使用万兆线,内网使用千兆线,osd共21个. 1台客户端:安装fio工具.内核客户端,使用万兆线. 测试目的 针对fio工具中的iodepth(队列深 ...
- tortoisesvn中看到的版本号和svn info不一致
tortoisesvn中看到的版本号和svn info不一致 在svn命令行中通过svn info命令获得的版本号与tortoisesvn中show log看到的不一样,原因是在小乌龟中可以只更新具体 ...
- mac中virtualBox添加主机网络报错VBoxNetAdpCtl: Error while adding new interface: failed to open /dev/vboxnetctl: No such file or directory
mac中virtualBox添加主机网络报错 现场复原 解决方法 参考 mac中virtualBox添加主机网络报错 现场复原 virtual box添加主机网络报错 VBoxNetAdpCtl: E ...
- 强化学习技巧三:Python多进程
1.Python多进程模块 Python中的多进程是通过multiprocessing包来实现的,和多线程的threading.Thread差不多,它可以利用multiprocessing.Proce ...
- 火山引擎ByteHouse:分析型数据库如何设计列式存储
更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 列式存储通过支持按列存储数据,提供高性能的数据分析和查询.作为云原生数据仓库的 ByteHouse,也采用列式存储 ...
- [zookeeper] 集群搭建及启动后查询服务器状态异常解决
一.集群搭建 1.每台服务器上部署zookeeper 1.将zookeeper压缩包解压到指定位置,在zookeeper解压后目录下创建数据目录zkData 2.在zkData下创建myid文件,内容 ...