c++中引用类型的属性

Attributes of type reference in C++

本文关键字:属性 引用类型 c++      更新时间:2023-10-16

我是Java开发人员。当我需要在类中放置引用属性时,我这样做:

public class Account{
    private int num;
    private Person client;
}

但是现在,我必须在c++

中做同样的事情

我如何在。h文件中做到这一点?

实际上我只有num属性:

class Account{
    private:
            int num;
    public:
            Account(int num);
            ~Account();
            int getNum();
            void setNum(int num);
}

我应该如何把Person属性放在下面,我应该如何编译它?谢谢。

至少有4种方法:

  1. 使用指针(Person*),这是大多数C和c++程序员可能会做的事情,但由于一些很好的理由,它被许多人皱眉。当不再需要对象时,您需要注意删除对象(如果几个对象可能引用同一个对象,这可能是非常重要的),并且必须确保指针在使用它之前是有效的(可怕的nullpointer)。
  2. 使用引用 (Person&),这将要求您在Account构造时初始化引用,并且您不能在对象的生命周期内稍后更改它。与指针不同,使用引用"看起来像"使用普通变量。
    在您的情况下,不能重设引用的限制可能是一个问题,因为可以想象一个帐户被另一个人占用了(比如,如果原来的所有者去世了)。在这种情况下,您必须删除Account对象并在其位置创建一个新对象。从积极的方面来看,引用保证是有效的(除非你特别恶意,真的试图欺骗编译器)。
  3. 使用shared_ptr<Person>,如果你想有一个引用计数的垃圾收集不像你在Java中拥有的。许多Account对象可以共享同一个Person,当引用计数为零时,它被删除。
  4. 简单地使用Person,这将使复制,可能不是你想要的,除非每个Person只被一个Account引用(不太可能,人们通常有几个帐户)。

这取决于你想要什么,在c++中,你必须比在Java中更具体地说,在Java中,一切都是垃圾收集的引用。您可能不希望该帐户"拥有"客户端(例如,当该帐户被删除时,相应的人员(或其副本)被删除),因此

class Account { Person client; /* ... */ };

是正确的(如果你想要帐户拥有他们的客户端,那么这是完全可以的,就这样做)所以你可能需要一个指针。

class Account { Person* client; /* ... */ };

那么引用的Person的"所有者"是/应该负责它的删除(也可能是它的创建),并且必须确保(即它必须通过程序的结构来确保)在它被销毁时没有指向它的悬空指针:这正是所有权的含义,当你来自Java时,这种想法可能对你来说是新的。

如果你不能确定Person的不同所有者,即它具有共享所有权,那么使用std::shared_ptr<Person>,这是一个引用计数智能指针,当所有shared_ptr对它的s都被销毁时,它将销毁指向对象(如果使用正确,它是最类似于垃圾收集的东西,你将在标准c++中获得,但请记住,如果你有循环引用,你需要用std::weak_ptr手动打破它们。

对于引用,您可能需要Person *,这是指向Person对象的Person指针。在java中,除了原语之外的一切都是引用。在c++中,你可以有值、指针和引用对象(由&指定)。Person * client;是代码

你不需要做任何特别的事情,真的:

class Account{
    int num;
    Person client;
public:
    Account(int num);
    ~Account();
    int getNum();
    void setNum(int num);
};

这是在创建一个对象(一个值),而不是一个引用,但是你是否真的想要/需要一个引用(也就是说,你可能需要,但又可能不需要)并不清楚。根据具体情况,您可能需要Person &client;(尽管这是很少需要的)或Person *client;(它创建指针,而不是引用,但是,Java的引用大多是"拒绝指针")。指针和引用(c++中使用这两个术语)的基本区别在于,指针可以被赋值,而引用只能被初始化。这意味着(除其他事项外),如果您的Account类包含引用成员,则可能不可能有意义地支持Account类的赋值。指针可以赋值

同时,仔细检查你的getNumsetNum,看看它们是否真的完成了什么有用的事情——如果它们像大多数Java中的访问器/变异器一样,你可能最好没有它们。