Tom*_*ger 0 c++ constructor reference class
从Java开始,C++让我伤透了脑筋。
我需要一个类来保存对主作用域中定义的变量的引用,因为我需要修改该变量,但在某些内部循环之前我无法实例化该类,而且我也没有引用直到那时。这给我的 Java 大脑带来了无穷无尽的挑战:
我习惯于在知道该变量中的实际值之前声明一个变量来确定其范围。例如,创建一个变量来在我的主作用域中保存一个对象,但MyClass test;C++ 不能忍受真空,并且将使用默认构造函数来实际实例化它。
此外,考虑到我想稍后将引用传递给该对象(类),如果我希望将该引用作为成员变量保存,则似乎必须在声明该成员变量时对其进行初始化。我不能只在类定义中声明成员变量,然后MyClass::init(int &myreference){}在程序流中使用它时使用一些变量来分配引用。
因此,这使得我想要做的事情看起来似乎不可能——在该类实例化之外的任何其他时间传递对要作为类中的成员变量保存的变量的引用。[更新,stack-overflow-rubber-ducking我意识到在这种情况下我实际上可以提前知道这些变量,这样就可以避开所有这些混乱。但我认为这个问题仍然相关,因为我确信我会经常遇到这种模式]
我除了使用指针之外别无选择吗?是否有一些明显的技术是我花费了数小时的时间无法发现的?
太长了;- 当无法在实例化/构造函数中定义它们时(即:列表初始化),如何正确使用类成员变量中的引用?
声明实例化时没有的引用成员变量
所有引用都必须初始化。如果您没有任何东西可以对其进行初始化,那么您就无法获得参考。
您似乎正在寻找的类型是指针。与引用一样,指针是一种间接形式,但与引用不同的是,指针可以默认初始化,并且它们具有空状态,并且可以在初始化后指向对象。
重要提示:与 Java 引用不同,C++ 引用和指针通常不会延长它们所引用的对象的生命周期。很容易在不知不觉中继续引用超出其生命周期的对象,并且尝试通过此类无效引用进行访问将导致未定义的行为。因此,如果您确实在成员中存储对象的引用或指针(作为参数提供),那么您应该向提供该对象的调用者明确说明这一点,以便他们可以确保正确的生命周期。例如,您可以将类命名为类似的名称reference_wrapper(顺便说一句,这是标准库中存在的类)。
为了具有与 Java 引用类似的语义,您需要共享所有权,以便每个所有者都延长所引用对象的生命周期。在 C++ 中,这可以通过共享指针 ( std::shared_ptr) 来实现。
但请注意,通常最好不要用 Java 思考,并将 Java 思想转化为 C++,但最好学习用 C++ 思考。共享所有权虽然方便,但是有成本,你必须考虑你是否负担得起。Java 程序员必须先“忘掉”Java,然后才能写出好的 C++。您还可以用大多数其他编程语言替代 C++ 和 Java,这同样适用。
看来成员变量必须在声明时初始化。
成员变量在声明时并不直接初始化。如果您在成员声明中提供初始值设定项,则该默认成员初始值设定项将在您未在构造函数的成员初始值设定项列表中为该成员提供初始值设定项时使用。
您可以初始化成员引用以引用作为构造函数(的成员初始化程序列表)中的参数提供的对象,但实际上不能在初始化类实例之后进行。
除了引用和指针所面临的生命周期挑战之外,引用成员变量的问题甚至更大。由于引用不能指向其他对象,也不能默认初始化,因此此类成员必然使类成为非“常规”,即该类的行为方式与基本类型不同。这使得此类类使用起来不太直观。
长话短说:
| 归档时间: |
|
| 查看次数: |
607 次 |
| 最近记录: |