持有对自身的引用的类实例-self 我最近一直在学习C++,我一直在尝试使用这个函数,明确地引用成员函数和成员变量的样式->

持有对自身的引用的类实例-self 我最近一直在学习C++,我一直在尝试使用这个函数,明确地引用成员函数和成员变量的样式->,c++,C++,然而,我有一个想法,并开发了一个小班来测试它: class foo { public: foo(); size_t get_val() const; void set_val(const size_t p); private: foo& self; size_t val; }; foo::foo() : self(*this), val(0) {} size_t foo::get_val() const { return self.val; }

然而,我有一个想法,并开发了一个小班来测试它:

class foo {
public:
    foo();
    size_t get_val() const;
    void set_val(const size_t p);
private:
    foo& self;
    size_t val;
};

foo::foo() : self(*this), val(0) {}
size_t foo::get_val() const { return self.val; }
void foo::set_val(const size_t p) { self.val = p; }
您可以在其中使用self.bar而不是此->栏

它编译得很好,我创建了几个实例并对其进行了一些处理,它似乎工作得很好(至少就我所知),但我只是想知道,对于非平凡类,这种定义是否会导致问题


作为旁注,我确实意识到没有真正的理由这样做。这个->条实际上只长一个字符,不需要构造函数中的额外数据成员。我只是对这样做很好奇。因此,就这个问题而言,“无意义”并不是一个真正的问题。

一个问题:它使每个对象都比一个引用的大小大。编译器无法优化不存在的成员

我想你可以用一个宏,比如

#define SELF (*this)

得到相同的效果,不支付大小成本。

或者可以使用<代码>定义自己(*this)< /C> >,不必担心这个黑客。C++程序员在引用<代码> < <代码>时,使用<代码>此< /Cord>关键字。这就是成语。使用它,它是有效的。
因此,就这个问题而言,“无意义”并不算是一个问题。
不算,无意义的问题可能会得到错误的答案。为什么编译器不能优化它呢?@BrianBi构造函数可以在另一个模块中,构造函数“s”可以很多。为了优化您的代码,我认为需要进行高级链接时间优化。@ikh请原谅我是个傻瓜,没有看到明显的东西,但这怎么可能呢?除了类定义中声明的构造函数外,不能定义两次类,也不能定义额外的构造函数。。。你能吗?@BrianBi如果我们这么想,我想你是对的。但我认为编译器并不像我们在这种情况下那么聪明。。无论如何,我之前的评论有点错误。。