2012-10-02 11 views
7

Powiel możliwe:
Why is there no call to the constructor?Jakie są różnice między testem t; i przetestuj t() ;? Jeśli test jest klasa

Używam Visual Studio 2012, załóżmy, że test jest klasą

class Test 
{ 
}; 

Kiedy tworzę nową instancję testu, jaka jest różnica dwóch następujących sposobów?

sposób 1

Test t; 

sposób 2

Test t(); 

mam to pytanie w poniższym kodzie, pierwotnie, zdefiniowałem instancji w drodze 2, mam tylko jeden błąd, ponieważ B nie dostarcza domyślnego konstruktora, ale kiedy zdefiniuję go w sposób 1, dostaję dodatkowy błąd.

class B 
{ 
    B(int i){} 
}; 

class A 
{ 
    A(){} 
    B b; 
}; 

int main(void) 
{ 
    A a(); // define object a in way 2 

    getchar() ; 
    return 0 ; 
} 

gdybym zdefiniować w sposób 1

A a; 

będzie Mam inny błąd powiedział

error C2248: 'A :: A': nie ma dostępu do prywatnych członka zadeklarowana w klasie "A"

Sądzę, że muszą istnieć pewne różnice między dwoma sposobami.

Odpowiedz

50

enter image description here

Test t; definiuje zmienną o nazwie t typu Test.

Test t(); deklaruje funkcję o nazwie t, która nie przyjmuje parametrów i zwraca wartość Test.

+20

+1 za zdjęcie :-) –

+1

cóż, co za głupie pytanie, jestem pewien, że wiem o tym wcześniej, ale ... dzisiaj nie jest mój dzień :( – zdd

+0

@zdd to się zdarza –

17

Jaka jest różnica między dwiema deklaracjami?

A a(); 

deklaruje funkcję, a nie obiektów. Jest to jeden z następujących: Most vexing parse w C++.
Deklaruje funkcję o nazwie a, która nie przyjmuje parametrów i zwraca typ A.

A a; 

Tworzy obiekt o nazwie a typu A przez wywołanie konstruktora domyślnego.

Dlaczego pojawia się błąd kompilacji?

Dla domyślnej klasy dostępu specyfikatorem jest private więc masz błąd, ponieważ konstruktor klasy jest private i nie może być wywołana podczas tworzenia obiektu z powyższej składni.

+0

dziękuję bardzo. – zdd

Powiązane problemy