首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >我应该更喜欢成员数据中的指针还是引用?

我应该更喜欢成员数据中的指针还是引用?
EN

Stack Overflow用户
提问于 2009-05-21 01:42:01
回答 8查看 105.7K关注 0票数 148

这是一个简单的例子来说明这个问题:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class A {};

class B
{
    B(A& a) : a(a) {}
    A& a;
};

class C
{
    C() : b(a) {} 
    A a;
    B b; 
};

所以B负责更新C的一部分。我通过lint运行代码,它抱怨引用成员:lint#1725。这篇文章谈到了对缺省拷贝和赋值的关注,这是足够公平的,但缺省拷贝和赋值在指针方面也不好,所以这样做没有什么好处。

我总是尽可能地使用引用,因为裸指针引入了不确定的关于谁负责删除该指针的问题。我更喜欢按值嵌入对象,但如果需要指针,我会在拥有指针的类的成员数据中使用auto_ptr,并将对象作为引用传递。

我通常只在成员数据中使用指针,当指针可能为空或可能更改时。对于数据成员来说,有没有其他更喜欢指针而不是引用的原因?

是否可以说包含引用的对象不应该是可赋值的,因为引用一旦初始化就不应该被更改?

EN

回答 8

Stack Overflow用户

发布于 2009-05-21 02:59:09

我自己的经验法则:

当你想让你的对象的生命周期依赖于其他对象的生命周期时,

  • Use一个引用成员:这是一种明确的方式,说明你不允许对象在没有另一个类的有效实例的情况下存活-因为没有赋值和通过构造函数获得引用初始化的义务。这是一个很好的方法来设计你的类,而不需要假设它的实例是不是另一个类的成员,你只需要假设它们的生命周期直接链接到其他实例。它允许您稍后更改如何使用您的类实例(对于new,作为本地实例,作为类成员,由管理器中的内存池生成,在其他情况下为:当您希望稍后更改成员时,使用指针或常量指针,以确保只读取指定的实例。有时你还需要在一个特殊的函数调用(例如())之后初始化成员,然后你就别无选择,只能使用一个指针。asserts但是:在所有的成员函数中使用asserts来快速检测错误的指针状态!在
  • In的情况下,你希望对象的生命周期依赖于外部对象的生命周期,并且你还需要该类型是可复制的,然后在构造函数中使用指针成员但引用参数,这样你就可以在构造上指示这个对象的生命周期取决于参数的生命周期,但实现使用指针来仍然是可复制的。只要这些成员只能通过复制来更改,并且您的类型没有默认构造函数,则该类型应该可以同时满足这两个目标。
票数 167
EN

Stack Overflow用户

发布于 2009-05-21 01:53:56

对象很少允许赋值和其他类似比较的东西。如果你考虑一些像“部门”,“雇员”,“总监”这样的对象的商业模型,很难想象一个员工被分配到另一个员工的情况。

因此,对于业务对象来说,将一对一和一对多关系描述为引用而不是指针是非常好的。

也许将一或零关系描述为指针也是可以的。

所以不能‘我们不能赋值’然后因子。

许多程序员只是习惯于使用指针,这就是为什么他们会找到任何参数来避免使用引用。

拥有一个指针作为成员将迫使你或你的团队成员在使用之前一次又一次地检查指针,并带有“以防万一”注释。如果指针可以是零,那么指针可能被用作一种标志,这是不好的,因为每个对象都必须扮演自己的角色。

票数 38
EN

Stack Overflow用户

发布于 2009-05-21 02:00:38

页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/892133

复制
相关文章
我更喜欢这样的工程师
提及影响力时,工程师通常迫切希望自己成为一名管理者,以便获得更多的信息和决策权。这是一个不好的信号,但却非常普遍。
我就是马云飞
2018/10/10
3820
对于数据分析而言,你更喜欢使用R还是Python?
? ? ? image.png
CDA数据分析师
2018/02/05
6410
对于数据分析而言,你更喜欢使用R还是Python?
指向类数据成员的指针
在C++中,可以定义一个指针,使其指向类成员或成员函数,然后通过指针 来访问类的成员。这包括指向属性成员的指针和指向成员函数的指针。它类似与static成员函数或成员变量,具有共享的属性。每一个实例化的对象都可以借助指向类数据成员的指针来访问指向的数据。它的结构图如下:
我与梦想有个约会
2023/10/20
1870
指向类数据成员的指针
C++对象成员的引用 | 对象成员引用
C++不仅可以在类外引用对象的公用数据成员,还可以调用对象的公用成员函数,但同样必须指出对象名,应该注意所访问的成员是公用的还是私有的,只能访问public成员,而不能访问 private成员。
小林C语言
2021/01/21
2.1K0
C++对象成员的引用 | 对象成员引用
指针的引用
有这么一个场景:程序中某一模块在对数据进行处理,另一个模块想要将其处理的数据写入文件,这时候有两种方案,一个是通过接口将数据拷贝出来,好处是写数据到文件不影响处理数据,缺点是占用内存较大;一个是将数据的地址传递出来,这样写入文件的时候不能对数据进行处理,好处是节省内存,不用重复的分配和释放内存。
零式的天空
2022/03/25
2970
为什么比起 IntelliJ IDEA,我更喜欢 Eclipse…
原文:https://dzone.com/articles/i-still-prefer-eclipse-over-intellij-idea 作者:Bozhidar Bozhanov                          译者:码农网 – 小峰 本文来自国外技术人员 Bozhidar Bozhanov 的使用感受,看看他有什么独特的见解呢!? 这么多年来,我观察到滚滚历史潮流正在从Eclipse涌向IntelliJ IDEA。去年,两者的使用率几乎相等,但是我感觉天平正在渐渐倾向IDEA。
Java技术栈
2018/06/04
1.9K3
我到底应该信gdb,还是cout?
是cout赢了,因为程序确实崩了。。。 其实我希望是gdb赢的。。。
看、未来
2021/10/25
2380
我到底应该信gdb,还是cout?
【C++ 语言】引用 ( 引用简介 | 指针常量 | 常量指针 | 常引用 | 引用参数 | 引用 指针 对比 )
C++ 对 C 扩充 : 引用 ( Reference ) 概念 , 是 C++ 在 C 的基础上进行的扩充 , 在 C 语言中是没有引用的 ;
韩曙亮
2023/03/27
1.2K0
我所喜欢的Big.One应该是这样的
我从2016年8月从Okcoin买入了人生的第一笔比特币,当时的价格不到4000元。由于学习了区块链生存知识,深知私钥的重要性,所以我把币一直存在自己的Bitcoin Core钱包里,一方面防止交易所
申龙斌
2018/03/06
1.1K0
我所喜欢的Big.One应该是这样的
指向类成员的指针
关注点在于 count_fruit 的第三个参数,这样就省去了单独编写 count_apples 和 count_oranges 函数的麻烦。
ClearSeve
2022/02/10
8210
关于引用(python中的伪指针)的理解
# 总结:个人理解,引用不可变的的变量时,随着改变会指向新的地址 # 引用可变的变量时,位置不会随着变量改变而改变 a = 1 b = a print(b) a = 2 # 指向了新的内存地址 print(a) print(b) # b不会变 c = 100 d = 100 print(id(c), id(d)) a = [1, 2] b = a print(a) print(b) a.append(3) # 这里指向的是同一个内存地址 print(a)
汪凡
2018/05/29
1.3K0
详解c++指针的指针和指针的引用
展示一下使用指针的指针和指针的引用修改传递给方法的指针,以便更好的使用它。(这里说的指针的指针不是一个二维数组) 为什么需要使用它们 当我们把一个指针做为参数传一个方法时,其实是把指针的复本传递给了方法,也可以说传递指针是指针的值传递。 如果我们在方法内部修改指针会出现问题,在方法里做修改只是修改的指针的copy而不是指针本身,原来的指针还保留着原来 的值。我们用下边的代码说明一下问题: int m_value = 1; void func(int *p) { p = &m_value; } i
lpxxn
2018/01/31
1.3K0
关于变量、指针、别名(引用)和指针的指针
C/C++中的指针和别名这个东西确实是够恶心的。今天蛋疼的就写一下这些东西的区别,变量永远是最简单的没有什么技术含量,那么另外一个比较简单的就是别名了,其实个人感觉这个东西完全可以看作是一个人的“小名”,只是对同一个变量多了一个称呼而已,指向的数据和地址是和原变量完全一致的,并且用&进行取地址操作的得到的地址和原变量的地址是完全一致的(因而在对指针进行赋值的时候如果直接对指针地址操作则需要对变量或者别名使用&进行取地址运算,如果要直接赋值则需要使用*p=进行赋值)。最复杂的就是指针了,同样个人认为指针到头来就是一个地址,这样可能会比较好理解一些。例如*pointer,那么带有*(解引用操作符)的时候则是表示的数值,如果没有*则表示的是地址。也就是说可以将pointer看成一个内存地址在这个地址中保存的是另外一个数据的地址,当存在*的时候表示取该地址存取的内容,否则则是取这个变量保存的地址。指针的指针则就更加复杂了,例如**p,那么可以看作指针保存的数据是另外的一个指针,解引用操作一次将会得到一个*p,这仍然是个指针,当进行二次解引用操作的时候(**p)才能读到p中保存的数据信息。这么说可能比较难理解,那么看个实例就明白了。效果如下图:
obaby
2023/02/28
1.4K0
关于变量、指针、别名(引用)和指针的指针
测试面试中,关于Python更喜欢考什么?
前面的文章中,聊质量内建测试平台化工程比较多,最近同学找我聊天,因为各种原因被裁了,在不多的面试机会中很多人又挂了,其中一个点是编程这块没自信,甚至面试官刚出题,一些同学就是直接说能不能跳过,所以今天这篇就面向初中级测试,聊聊面试中,关于Python的考点喜欢问什么?
周辰晨
2022/09/20
2810
指针和引用的区别
先看代码输出是什么? 最后输出是: 1234567890 hello 指针和引用主要区别 1 在C++中,指针和引用经常用于函数的参数传递, 然而,指传递参数和引用传递参
早起的鸟儿有虫吃
2018/04/13
7350
指针和引用的区别
nim的引用和指针
nim语言的引用和其他语言的指针有点相似 可以提供一种“多对一”的关系 这就意味着不同的引用可以指向同一个内存位置 nim区分可被追踪的引用和不可被追踪的引用 不可被追踪的引用又称为指针 可被追踪的引用可以被垃圾回收器回收 不可被追踪的引用指向手动分配的对象,或其他地方创建出来的一块内存区域 这也就是说,不可被追踪的引用是不安全的 对于某些底层操作,不可被追踪的引用有其存在的必要 可被追踪的引用使用ref关键字定义, 不可被追踪的引用使用ptr关键字定义 空下标的方括号[]可以用来解引用 addr方法可以返
liulun
2018/01/12
9400
业界 | 医疗AI应该更关注「数据」还是「人」?数据工程师反思机器学习模型的力量
最近,《华尔街日报》的一篇文章——《Models Will Run the World》(模型将玩转世界)在网上流传。我相信这种观点在很大程度上是有道理的。机器学习算法和模型在各行各业都越来越普遍,也越来越受人信赖。但是反过来看,这导致我们花在结果审查的时间上越来越少,反而更加依赖系统给出答案。我们已经依靠谷歌、Facebook 和亚马逊等公司来提供约会、朋友生日以及最佳产品等方面的信息。当我们从这些公司得到答案时,一些人甚至会不假思索地听之信之。
机器之心
2018/09/20
3300
业界 | 医疗AI应该更关注「数据」还是「人」?数据工程师反思机器学习模型的力量
为什么我应该使用指针而不是对象本身
对于现代 C++ (尤其是 C++ 11 之后),大量使用 new 动态分配是不明智的选择。
ClearSeve
2022/02/10
1.4K0
C++ 类成员指针
成员指针是 C++ 引入的一种新机制,它的申明方式和使用方式都与一般的指针有所不同。成员指针分为成员函数指针和数据成员指针。
恋喵大鲤鱼
2022/11/29
8020
C++类成员指针
成员指针是C++引入的一种新机制,它的申明方式和使用方式都与一般的指针有所不同。成员指针分为成员函数指针和成员数据指针。
恋喵大鲤鱼
2018/08/03
1.4K0

相似问题

在公开PowerShell模块成员时,我应该更喜欢还是全局范围?

13

我应该更喜欢Perl中的散列还是hashrefs?

30

Haskell:更喜欢模式匹配还是成员访问?

60

成员指针还是引用参数?

15

与非指针成员相比,我是否更喜欢显式分配?

15
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文