2016-02-29 2 views
-4

Я новичок в C++. Я видел несколько примеров классов. Мне трудно понять, когда мне нужно вызвать costuctor (whith()), когда я создаю объект, и когда мне не нужно создавать его с помощью конструирующего.C++ создать объект с конструктором или без него?

+0

Объекты всегда создаются с помощью конструктора –

+0

Показать код о создании объекта с конструктором или без него. – songyuanyao

+1

Использование круглых скобок делает «вызов» более явным, но конструктор всегда вызывается. –

ответ

2

Конструктор всегда вызывается при создании объекта C++ (типа класса). Вы не можете это изменить.

Если у вас есть конструктор по умолчанию (тот, который не принимает никаких аргументов между ()), то она будет вызываться с чем-то же просто, как

YourClass x; 

Это на самом деле очень плохая идея использовать (), чтобы создать объект в этом случае, так как

YourClass thing(); 

компилятор интерпретирует это как объявление функции с именем thing(), который не принимает никаких аргументов и возвращает значение типа YourClass , Это, как правило, вызывает ошибки компиляции, если thing используется как обычный экземпляр объекта.

+0

Как я недавно узнал, это не то, что Скотт Майерс назвал самым неприятным анализом. – StoryTeller

+1

Что Мейерс назвал самым неприятным анализом в контексте шаблонов. Однако такая же проблема возникает и вне шаблонов. Во всяком случае, я удалю ссылку на досадный синтаксический разбор, так как обсуждение терминологии ничего не добавляет для OP. – Peter

+0

@ Питер - как насчет конструктора, который должен получить параметры? – Sarti

0

Конструктор всегда вызывается при создании объекта, он может вызывать неявно.

class SomeClass 
{ 
    SomeClass() {} 
}; 

SomeClass myObject; // in fact it a: SomeClass myObject = SomeClass(); 
+2

Вы обнаружите, что 'SomeClass myObject = SomeClass()' не сможет скомпилироваться, если 'SomeClass' не имеет доступного конструктора копирования. 'SomeClass myObject' не будет терпеть неудачу в этом случае. – Peter

1

Если объект создан, всегда вызывается один из его конструкторов.

Foo x; 
Foo x{}; 

Все указанные выше заявления будут делать то же самое, создать Foo объект с помощью конструктора в по умолчанию. Обратите внимание, что Foo x(); недействителен в этом контексте, см. Ответ Питера о том, почему.

Если вы должны передать аргументы конструктору, или если вы должны использовать новый, вы всегда должны использовать скобки:

Foo y(42, true); 
Foo y{21, false}; 
Foo* y = new Foo(); 
Foo* y = new Foo(2, false); 
+1

Второй случай 'Foo x()' НЕ создает 'Foo'. Это пример самого досадного разбора. – Peter

+0

@Peter Правильно. –

0

Если вы создаете объект, вы всегда вызывать конструктор. Либо вы используете круглые скобки, либо (с новым стандартом) вы можете использовать фигурные скобки. Если вы хотите вызвать конструктор без аргументов, вы можете опустить скобки alltogether, но вы все равно вызовете конструктор.

Единственная возможность не вызвать конструктор - использовать указатели, поскольку указатель содержит только адрес памяти объекта. Чтобы на самом деле создать объект, вам нужно использовать new (вызов конструктора снова), но это можно сделать позже или вообще пропустить, если уже есть объект, на который вы хотите указать.
Для встроенных типов вы также можете пропустить «конструктор», который приводит к унифицированным переменным.

Если конструктор вы называете это один вы определили себя или если оно неявно определяется компилятором другой вопрос, хотя ...

+0

Вы получите сообщение об ошибке при «просто распределении памяти» и попробуйте присвоить его указателю на объект. Этот параграф просто путает непосвященных. – StoryTeller

+0

Яснее ли это? – Anedar

+0

Не совсем. Параграф о том, как обходить инвариант, гарантированный языком, и в основном с ручным размахом, не является конструктивным в этом случае ИМХО. – StoryTeller

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