2015-04-16 14 views
5

Termin "Default Constructor" jest oficjalny zarówno w Javie, jak iw C++ i wydaje się, że w obu światach ma on znaczenie. Czy mogę wiedzieć, czy moje zrozumienie jest poprawne i jakie jest właściwe nazewnictwo niektórych powiązanych pojęć?Domyślnie Constructor, Java kontra C++

  1. domyślnego konstruktora w Java oznacza (Nie-Arg) Konstruktor wygenerowany przez kompilator, gdy nie ma konstruktor zdefiniowane dla klasy.

  2. Domyślny konstruktor w C++ oznacza konstruktor, który można wywołać bez argumentów.

Biorąc pod uwagę następujący przykład

Java:

class NoCtorClass { 
    // No ctor defined, compiler is generating one --------- J-1 
} 

class NoArgCtorClass { 
    public NoArgCtorClass() { ... } -------------------------- J-2 
} 

C++:

class NoCtorClass { 
    // implicitly NoCtorClass() constructor is provided -------- C-1 
} 

class DefaultCtorClass { 
public: 
    // Explicitly telling compiler to give the default one 
    DefaultCtorClass() = default; ---------------------------- C-2 
} 

class NoArgCtorClass { 
public: 
    NoArgCtorClass(); ----------------------------------------- C-3 
} 
NoArgCtorClass::NoArgCtorClass() {....} 


class NoArgCtor2Class { 
public: 
    NoArgCtor2Class(int i = 0); -------------------------------- C-4 
} 
NoArgCtor2Class::NoArgCtor2Class (int i = 0) {....} 

w Javie, tylko J-1 jest oficjalnie nazywany konstruktor domyślny, podczas gdy J-2 nie jest.

W C++ wszystkie C-1 do C-4 są oficjalnie nazywane konstruktorem domyślnym.

Czy moje rozumowanie jest prawidłowe?

Jeśli tak, kilka pytań w terminologii:

  1. Jaka jest właściwa nazwa w języku Java dla ctor bez argumentu? (tj. J-1 i J2). Zwykle nazywam to konstruktorem No-Arg. (Dla których odpowiada koncepcji default-ctor w C++)

  2. Jaka jest właściwa nazwa w C++ dla ctor generowanego przez kompilator? (tzn. C-1 i C-2 .Przy słowem kluczowym default wygląda na to, że powinno być nazywane domyślne, a następnie powinno być nazywane "domyślnym domyślnym konstruktorem" (dla którego odpowiada koncepcji default-ctor w Javie)

  3. Podobny do 2, jak powinniśmy zadzwonić kompilator generowane Copy-konstruktor, operator przypisania, i etc? "Default-Copy-Konstruktor"?

+0

[To odwołanie może pomóc] (http://en.cppreference.com/w/cpp/language/default_constructor). Generowany domyślny konstruktor kompilatora jest domyślnym konstruktorem generowanym przez kompilator, nie ma na to prawdziwej nazwy. –

+0

@JoachimPileborg "domyślny konstruktor domyślny". –

+2

Podejrzewam, że 'C++' dostaje swój termin 'default constructor' od sytuacji, gdy twórca obiektu nie może określić argumentów konstruktora (np. Podczas tworzenia tablicy) i dlatego wywoływany jest konstruktor' default' (no arg needed). Nie jest to problemem w 'Java', gdy tablice obiektów zawsze zawierają wskaźniki, a nie same obiekty. – Galik

Odpowiedz

0

w Javie zarówno nazywane są domyślne konstruktorów. kompilator Java wewnętrznie generuje konstruktor bez argumentów.Jeśli podasz konstruktor bez argumentów, to tak jakbyś nadpisał konstruktor.

public NoArgCtorClass() { ... } 

Na przykład jakie kiedykolwiek kod zachować w {...} będzie uzyskać wykonywane podczas instancję obiektu ...

Uwaga: jeśli masz przeciążony konstruktora, trzeba jawnie pisać domyślny constrcutor , ponieważ kompilator nie generuje w tym przypadku żadnego konstruktora args.

+3

* "W języku java oba są nazywane konstruktorami domyślnymi." * Nie, nie są. http://docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#jls-8.8.9 – Radiodef

+0

@Radiodef źle czytasz: * - Domyślny konstruktor ma taką samą dostępność jako klasy, Domyślny konstruktor nie ma formalnych parametrów, z wyjątkiem niepodzielnej klasy podzespołu wewnętrznego, w której domyślny konstruktor domyślnie deklaruje jeden formalny parametr reprezentujący bezpośrednio otaczającą instancję klasy, - Domyślny konstruktor nie ma klauzul throws, - Jeśli zadeklarowana klasa jest pierwotnym obiektem klasy, wówczas domyślny konstruktor ma puste ciało. W przeciwnym razie domyślny konstruktor po prostu wywołuje konstruktor superklasy bez argumentów * –

+1

@LuiggiMendoza Myślę, że to, co cytowałeś, jest nieistotne: dotyczy "cech domyślnego konstruktora", zamiast mówić "konstruktor z taką cechą jest domyślnym konstruktorem" . Pierwsza linijka w cytowanym dokumencie: "Jeśli klasa nie zawiera deklaracji konstruktora, domyślnie deklarowany jest domyślny konstruktor" wydaje mi się, że jest to ctor generowany, gdy nie deklaruje się ctor. I nazywamy tego rodzaju generowanym domyślnym konstruktorem "ctor" –

0
  1. Java docs - „Jeśli klasa nie zawiera deklaracji konstruktora, a następnie domyślny konstruktor bez parametrów formalnych i nie rzuca klauzula jest niejawnie zadeklarowana”.Jeśli konstruktor bez arg jest zdefiniowany przez użytkownika, nadal jest określany jako domyślny konstruktor zgodnie z JLS. W praktyce programiści nie zawsze trzymają się tej konwencji, ponieważ mogą być niejednoznaczni (niektórzy nie używają konstruktora arg, itp.).

  2. Z mojego doświadczenia wynika, że ​​zarówno wersje konstruktorów C1 i C2 (domyślne i jawne) są jako domyślne konstruktory.

  3. Generowane przez kompilator metody domyślne dla klasy są ogólnie nazywane:; Domyślny konstruktor, Copy constructor, Copy assignment i Destructor. Zwykle jest to po prostu konstruktor bez argumentów, który otrzymuje prefiks "default", mimo że wszystkie metody są podane domyślnie (pusta klasa).

+0

* Innymi słowy, zmienia się * Nie widzę tego. Ten sam segment linku JLS, który podajesz, podaje przykład, gdzie ** jasno stwierdza ** to: * gdzie ** domyślny konstruktor ** jest 'publiczny', ponieważ klasa' Punkt' jest publiczna * –

+1

Dla punktu 2, z definicji w C++, C1 i C2 są domyślnym konstruktorem, ** oraz C3 i C4 ** –

+0

@LuiggiMendoza Jeśli mówisz, że JLS wywołuje jawnie zadeklarowany konstruktor jako "domyślny konstruktor", czytasz to źle. Drugi fragment kodu w przykładzie 8.8.9-1 nie jest przykładem domyślnego konstruktora; jest przedmiotem frazy "jest równoważne". Oznacza to, że _first_ snippet, który ma niejawny konstruktor, ** jest równoważny ** drugiemu fragmentowi - dlatego jest tam drugi fragment. Ten przykład _nie_ próbuje pokazać dwa przykłady domyślnego konstruktora. Nie jestem pewien, czy o tym właśnie myślałeś - ale jeśli tak, to czytasz to źle. – ajb