2015-04-16 4 views
5

Термин «конструктор по умолчанию» является официальным как в Java, так и в C++, и, похоже, это означает другое в двух мирах. Могу ли я узнать, правильно ли я понимаю и что такое правильное обозначение некоторых связанных понятий?По умолчанию Constructor, Java vs C++

  1. По умолчанию Конструктор в Java означает (No-Arg) Конструктор, генерируемый компилятором, когда нет конструктор, определенный для класса.

  2. По умолчанию конструктор в C++ означает конструктор, который можно вызвать без аргумента.

Учитывая следующий пример

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) {....} 

в Java, только J-1 официально называется конструктором по умолчанию, а J-2 - нет.

В C++ все C-1-C-4 официально называются конструктором по умолчанию.

Я правильно понял?

Если да, некоторые вопросы терминологии:

  1. Что такое имя собственное в Java для CTOR без аргумента? (то есть J-1 и J2). Обычно я называю это No-Arg Constructor. (Для чего соответствует концепции default-ctor в C++)

  2. Какое имя в C++ для ctor генерируется компилятором? (т. е. C-1 и C-2. С ключевым словом default, похоже, он должен быть назван по умолчанию. Тогда следует ли его называть «стандартным конструктором по умолчанию»? (для которого соответствует концепция default-ctor в Java)

  3. Аналогично 2, как мы должны называть компилятором Прописи т е р, оператор присваивания, и т.д.? «Default-Copy-конструктор»?

+0

[Эта ссылка может помочь] (http://en.cppreference.com/w/cpp/language/default_constructor). И созданный компилятором конструктор по умолчанию - это созданный по умолчанию конструктор по умолчанию, для которого нет реального имени. –

+0

@JoachimPileborg "дефолтный конструктор по умолчанию". –

+2

Я подозреваю, что 'C++' получает свой термин 'конструктор по умолчанию 'из ситуаций, когда создатель объекта не может указывать аргументы конструктора (например, при создании массива), и поэтому вызывается конструктор' default' (no arg required). Это не проблема в Java, когда массивы объектов всегда содержат указатели, а не сами объекты. – Galik

ответ

0

в Java и называются конструкторами по умолчанию. Java-компилятор внутренне генерирует конструктор без аргументов.Если вы укажете конструктор без аргументов, его, как и вы, переопределите конструктор.

public NoArgCtorClass() { ... } 

Например, что когда-либо код, который вы держите в {...} будут выполнены, когда экземпляр объекта ...

Примечание: если у вас есть перегруженный конструктор, вы должны написать явно constrcutor по умолчанию , так как компилятор в этом случае не генерирует конструктор args.

+3

* «В java оба называются конструкторами по умолчанию». * Нет, это не так. http://docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#jls-8.8.9 – Radiodef

+0

@Radiodef вы неправильно читаете: * - Конструктор по умолчанию имеет такую ​​же доступность как класс, конструктор по умолчанию не имеет формальных параметров, за исключением неединичного внутреннего класса-члена, где конструктор по умолчанию неявно объявляет один формальный параметр, представляющий непосредственно входящий экземпляр класса, - конструктор по умолчанию не имеет предложений бросков, Если объявляемый класс является искомым объектом класса, то конструктор по умолчанию имеет пустое тело. В противном случае конструктор по умолчанию просто вызывает конструктор суперкласса без аргументов. * –

+1

@LuiggiMendoza. Я думаю, что вы цитируете не имеет значения: речь идет о «характеристиках конструктора по умолчанию», а не о том, что «конструктор, несущий такую ​​характеристику, является конструктором по умолчанию» , Первая строка в цитируемом документе: «Если класс не содержит деклараций конструктора, то конструктор по умолчанию объявляется неявно» кажется мне кажется, что a генерируется ctor, когда не объявляется ctor. И мы называем такого рода сгенерированный ctor «конструктор по умолчанию» –

0
  1. Java docs - «Если класс не содержит конструктор деклараций, то конструктор по умолчанию без формальных параметров и не проливает положение неявно объявляется».Если конструктор no arg не определен пользователем, он по-прежнему называется конструктором по умолчанию в соответствии с JLS. На практике программисты не всегда придерживаются этого соглашения, так как могут быть неоднозначными (некоторые используют конструктор arg и т. Д.)

  2. В моем опыте как версии конструкторов C1 и C2 (неявные, так и явные) как конструкторы по умолчанию.

  3. Компилятор, сгенерированный по умолчанию для класса, обычно называется следующим: Конструктор по умолчанию, конструктор копирования, назначение копирования и деструктор. Обычно это просто конструктор no argument, который получает префикс «default», хотя все методы заданы по умолчанию (пустой класс).

+0

* Другими словами, он меняется * Я не вижу этого. Один и тот же сегмент JLS, который вы связываете, дает пример, в котором ** он четко заявляет ** это: *, где конструктор ** по умолчанию ** является 'public', потому что класс' Point' является общедоступным * –

+1

Для пункта 2, по определению в C++, C1 и C2 являются конструкторами по умолчанию **, а также C3 и C4 ** –

+0

@LuiggiMendoza Если вы говорите, что JLS вызывает явно объявленный конструктор «конструктор по умолчанию», вы читаете его неправильно. Второй фрагмент кода в примере 8.8.9-1 не является примером конструктора по умолчанию; это объект фразы «эквивалентен». То есть, фрагмент _first_, который имеет неявный конструктор, ** эквивалентен ** второму фрагменту - вот почему есть второй фрагмент. Этот пример не пытается показать два примера конструктора по умолчанию. Я не уверен, что вы думали, но если так, вы читаете это неправильно. – ajb

Смежные вопросы