在使用某些类库的时候,有时传引用,有时传指针,这有什么设计原则吗?

2021-01-26 10:01:23 +08:00
 James369
比如说,这 2 个 Http 的 post 方法:
QNetworkReply *post(const QNetworkRequest &request, QIODevice *data);
QNetworkReply *post(const QNetworkRequest &request, const QByteArray &data);
一个 data 传指针,一个传引用。

另外,我发现一个有趣现象,就是使用栈上的变量,最好传引用,传指针可能会导致运行出错。
比如像这样:
QIODevice dev;
... //dev 操作
auto reply = manager->post(request, &dev); //栈上的 dev 会出现段错误,而如果是 new QIODevice 再传指针就没事。

而这种情况,直接用栈上的变量却又没事。
QByteArray data;
... //data 操作
auto reply = manager->post(request, data); //一切正常
2830 次点击
所在节点    C++
22 条回复
edimetia3d
2021-01-26 23:22:11 +08:00
.. 印象中很多书都说过这个问题啊, 主要是 style 的问题, 技术层面没有什么优劣, 引用底层也是指针.


函数传参中, 如果不用拷贝传值, 那么只能用`const T &`或者 `T *`
`const T &`用于向用户表明: 我一定不会修改传入的对象.
`T *`用于向用户表明: 我会(极有可能)修改传入的对象.

从调用方看也能直观的看出来, `func(obj1,&obj2)`,`obj1`要么是 const 引入传入的,要么是拷贝传入,所以一定不会被修改.
`&obj2`则很有可能在函数 return 后被修改.

Google Style 应该也是这样的.
intlinfo
2021-02-08 02:23:51 +08:00
指针自由度高,引用并非不可为空,在设计上引用也可以为 nil

两者都是指向同一内存地址,只是 指针是 -> 引用是 .

在多线程的情况下,引用直接引用原有地址。

基础指针引用原有地址,c++11 智能指针传参时会涉及到复制。

具体多谢 test 自行测试观察为好。要讲理论我不行嘿嘿,但是实际上写代码还是会注意这些问题的,经验积累的。

拒绝脑残面试官让你讲理论。 :)

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://tanronggui.xyz/t/748389

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX