2013-01-23 14 views
15

możemy zrobić coś takiego:sizeof (* this) w definicji klasy

#include <iostream> 

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

W C Standard widzę następujące:

ISO/IEC 9899: 2011

6.7.2.1 Specyfikatory konstrukcji i połączeń

8 ... Typ jest niekompletny do momentu bezpośrednio po} kończy listę, a następnie ją kończy.

Ale w C++ Standard nie mogę znaleźć żadnego analogu.

Operator sizeof nie zostanie zastosowany do wyrażenia, które ma niekompletny typ, więc czy możemy napisać taki kod, czy nie?

+4

9.2p2 wypełniacz wlewu –

+0

+1 do sprawdzenia specyfikacji przed wysłaniem. –

Odpowiedz

10

Tak, możesz napisać taki kod, ponieważ kompilator musi traktować go tak, jakby definicja klasy była kompletna w implementacjach metod klas.

Na przykład musi traktować je tak, jakbyś napisał:

#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'; } 
+0

Czy możemy też napisać coś takiego? http://liveworkspace.org/code/hN4ty$0 – FrozenHeart

+0

Nie jest to niedozwolone. "Niepoprawne użycie" tego "na najwyższym poziomie" error.it nie znajduje się w żadnej funkcji członka. "to" powstaje, gdy klasa jest tworzona . ale w tym kodzie używamy go przed jego istnieniem. – Arpit

+0

@Arpit: inicjalizacja w przykładzie liveworkspace.org jest dozwolona przez C++ 11 z powodu 9.2/2: "W specyfikacji klasy klasy, klasa jest uważana za kompletną w obrębie ciał funkcji, domyślne argumenty, specyfikacje wyjątków, oraz ** inicjatory typu "bras" lub "równe" ** dla niestatycznych elementów danych "(podkreślenie dodane). –

8

Wewnątrz ciała funkcji członek klasa jest kompletność indziej, nie można uzyskać dostępu do żadnych innych funkcji składowych, ani dostępu do żadnych zmiennych składowych , co uczyniłoby dość bezwartościowym członkiem.

+0

Czy możemy również napisać coś takiego? liveworkspace.org/code/hN4ty$0 – FrozenHeart

+0

@NikitaTrophimov no, ale to działa: [link] (http://liveworkspace.org/code/pPdNc$0) –

1

Tak, możesz pisać, a wynik będzie również poprawny.

#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; 
    } 
Powiązane problemy