15

我们可以做这样的事情:

#include <iostream>

class Foo
{
public:
   Foo() { std::cout << sizeof(*this) << '\n'; }
};

在 C 标准中,我看到以下内容:

ISO/IEC 9899:2011

6.7.2.1 结构和联合说明符

8 ... 直到终止列表的 } 之后,类型才不完整,然后完成。

但在 C++ 标准中我找不到任何类似物。

sizeof 运算符不能应用于类型不完整的表达式,那么我们是否可以编写这样的代码?

4

3 回答 3

10

是的,您可以编写这样的代码,因为编译器必须将其视为类定义在类方法实现中是完整的。

例如,它必须像您写的那样对待它:

#include <iostream>

class Foo
{
public:
   Foo();
};

// Methods declared in the body of a class are implicitly inline
// Inline, however, probably doesn't mean what you think it means:
inline Foo::Foo() { std::cout << sizeof(*this) << '\n'; }
于 2013-01-23T18:08:01.460 回答
8

在成员函数体内,类是完整的——否则,您无法访问任何其他成员函数,也无法访问任何成员变量,这将成为一个相当没有价值的成员。

于 2013-01-23T18:08:06.003 回答
1

是的,你可以写,结果也是正确的。

#include<iostream>
using namespace std;
class Foo
{
public:
       int x;
   Foo() { std::cout << sizeof(*this) << '\n'; }
};
int main(){
    Foo b;
    b.x=5;
    system("pause");
    return 0;
    }
于 2013-01-23T18:13:57.273 回答