2012-11-06 12 views
6

Powiel możliwe:
Default constructor with empty bracketsKonstruktor problem

Jest to kod, który pracował i nie rozumiem, co się dzieje na obj2 konstruktor Package(); Na wyjściu wyświetlane są tylko wartości 4 (obj1 Package (4)) i 2 (obj3 Package (2))

#include <iostream> 
using namespace std; 
class Package 
{ 
private: 
    int value; 
public: 
    Package() 
    { 
     cout<<"constructor #1"<<endl; 
     value = 7; cout << value << endl; 

    } 
    Package(int v) 
    { 
     cout<<"constructor #2"<<endl; 
     value = v; cout << value << endl; 

    } 
    ~Package() 
    { 
     cout<<"destructor"<<endl; 
     cout << value << endl; 
    } 
}; 

int main() 
{ 
    Package obj1(4); 
    Package obj2(); 
    Package obj3(2); 

} 

Odpowiedz

4

Linia

Package obj2(); 

musi być

Package obj2; 

Więcej informacji

http://www.parashift.com/c++-faq/empty-parens-in-object-decl.html

lub alternatywa wziąć na to (z pamięci podręcznej Google, real miejscu była w dół, a Weź to z przymrużeniem oka, podnosi punkty, ale robi to najlepiej aby je brzmią gorzej niż są):

http://webcache.googleusercontent.com/search?q=cache:http://yosefk.com/c%2B%2Bfqa/ctors.html#fqa-10.2

+0

Podałem powód, podałeś poprawkę! –

+0

Nie potrzebujesz '()' podczas wywoływania domyślnego contruktora –

+1

@ EmmanuelN to nie tylko "nie potrzebujesz", ale "nie wolno używać". – hyde

8

nie zadeklarować obiekt:

Package obj2(); 

Wierzcie lub nie, deklaruje funkcję, która zwraca obiekt Package. Nazywa się "most vexing parse."

4

Jeśli używasz C++ 11, i chcą, aby rozwiązać problem 'najbardziej dokuczliwy parse' można zastąpić

Package obj2(); 

z

Package obj2{}; 

jest częścią uniform initialization syntax C++ 11, który został zaprojektowany przede wszystkim, aby ominąć ten problem.

Powiązane problemy