c++中引用类型的属性
Attributes of type reference in C++
我是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种方法:
- 使用指针(
Person*
),这是大多数C和c++程序员可能会做的事情,但由于一些很好的理由,它被许多人皱眉。当不再需要对象时,您需要注意删除对象(如果几个对象可能引用同一个对象,这可能是非常重要的),并且必须确保指针在使用它之前是有效的(可怕的nullpointer)。 - 使用引用 (
Person&
),这将要求您在Account
构造时初始化引用,并且您不能在对象的生命周期内稍后更改它。与指针不同,使用引用"看起来像"使用普通变量。
在您的情况下,不能重设引用的限制可能是一个问题,因为可以想象一个帐户被另一个人占用了(比如,如果原来的所有者去世了)。在这种情况下,您必须删除Account
对象并在其位置创建一个新对象。从积极的方面来看,引用保证是有效的(除非你特别恶意,真的试图欺骗编译器)。 - 使用
shared_ptr<Person>
,如果你想有一个引用计数的垃圾收集不像你在Java中拥有的。许多Account
对象可以共享同一个Person
,当引用计数为零时,它被删除。 - 简单地使用
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类的赋值。指针可以赋值
同时,仔细检查你的getNum
和setNum
,看看它们是否真的完成了什么有用的事情——如果它们像大多数Java中的访问器/变异器一样,你可能最好没有它们。
- 强制转换为引用类型
- 用概念检查属性的类型
- 自定义引用类型
- Java 中是否有类似于 C++ 中引用类型"&"的内容?
- 为什么我不能在运算符=中使用引用类型?
- 可变参数模板函数参数和引用类型推导
- 隐式可转换参数,但属于引用类型
- 如何告诉自动推断向量<bool>元素的非引用类型
- 为什么"const auto [x, y]"绑定到引用类型时没有按预期运行?
- 引用类型的数据成员提供有关恒常正确性"loophole"
- 为什么引用类型在使用临时对象访问时是左值
- 什么是常量指针常量引用类型的参数?(const X* const & p)
- 在 lambda 中从引用类型捕获的值的类型,不使用通用捕获
- 如果类在 C++ 中具有常量或引用类型的非静态数据成员,为什么编译器不提供默认赋值运算符?
- void*作为通用引用类型是如何工作的
- 强制转换为不相关的引用类型是否违反严格的别名规则?
- C++ 引用类型作为递归函数参数
- EXPECT_CALL具有 unique_ptr 引用类型参数的模拟函数
- 如果使用返回引用的函数初始化"auto"var,为什么它不声明引用类型?
- c++中引用类型的属性