Я новичок в C++. Я видел несколько примеров классов. Мне трудно понять, когда мне нужно вызвать costuctor (whith()), когда я создаю объект, и когда мне не нужно создавать его с помощью конструирующего.C++ создать объект с конструктором или без него?
ответ
Конструктор всегда вызывается при создании объекта C++ (типа класса). Вы не можете это изменить.
Если у вас есть конструктор по умолчанию (тот, который не принимает никаких аргументов между ()
), то она будет вызываться с чем-то же просто, как
YourClass x;
Это на самом деле очень плохая идея использовать ()
, чтобы создать объект в этом случае, так как
YourClass thing();
компилятор интерпретирует это как объявление функции с именем thing()
, который не принимает никаких аргументов и возвращает значение типа YourClass
, Это, как правило, вызывает ошибки компиляции, если thing
используется как обычный экземпляр объекта.
Как я недавно узнал, это не то, что Скотт Майерс назвал самым неприятным анализом. – StoryTeller
Что Мейерс назвал самым неприятным анализом в контексте шаблонов. Однако такая же проблема возникает и вне шаблонов. Во всяком случае, я удалю ссылку на досадный синтаксический разбор, так как обсуждение терминологии ничего не добавляет для OP. – Peter
@ Питер - как насчет конструктора, который должен получить параметры? – Sarti
Конструктор всегда вызывается при создании объекта, он может вызывать неявно.
class SomeClass
{
SomeClass() {}
};
SomeClass myObject; // in fact it a: SomeClass myObject = SomeClass();
Вы обнаружите, что 'SomeClass myObject = SomeClass()' не сможет скомпилироваться, если 'SomeClass' не имеет доступного конструктора копирования. 'SomeClass myObject' не будет терпеть неудачу в этом случае. – Peter
Если объект создан, всегда вызывается один из его конструкторов.
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);
Второй случай 'Foo x()' НЕ создает 'Foo'. Это пример самого досадного разбора. – Peter
@Peter Правильно. –
Если вы создаете объект, вы всегда вызывать конструктор. Либо вы используете круглые скобки, либо (с новым стандартом) вы можете использовать фигурные скобки. Если вы хотите вызвать конструктор без аргументов, вы можете опустить скобки alltogether, но вы все равно вызовете конструктор.
Единственная возможность не вызвать конструктор - использовать указатели, поскольку указатель содержит только адрес памяти объекта. Чтобы на самом деле создать объект, вам нужно использовать new
(вызов конструктора снова), но это можно сделать позже или вообще пропустить, если уже есть объект, на который вы хотите указать.
Для встроенных типов вы также можете пропустить «конструктор», который приводит к унифицированным переменным.
Если конструктор вы называете это один вы определили себя или если оно неявно определяется компилятором другой вопрос, хотя ...
Вы получите сообщение об ошибке при «просто распределении памяти» и попробуйте присвоить его указателю на объект. Этот параграф просто путает непосвященных. – StoryTeller
Яснее ли это? – Anedar
Не совсем. Параграф о том, как обходить инвариант, гарантированный языком, и в основном с ручным размахом, не является конструктивным в этом случае ИМХО. – StoryTeller
- 1. C++ Как создать объект с параметризованным конструктором?
- 2. Объявление переменной C# с конструктором и без него
- 3. Как создать объект с конструктором с параметром
- 4. C++ вставляя объект с конструктором в карту
- 5. Эйфелева «создать» над конструктором C++?
- 6. Экспорт классов с конструктором или без конструктора
- 7. Использование JNIEnv с парентазом или без него?
- 8. объект Initialize в C# с() или без
- 9. Создать объект без New?
- 10. Почему невозможно создать пару с конструктором копии «non const», в то время как можно создать экземпляр без него?
- 11. Selenium - Как найти объект без него и Id или Имя?
- 12. Если селектор NSNotificationCenter имеет объект NSNotification или без него
- 13. Объект Singleton с параметризованным конструктором
- 14. Общий объект с частным конструктором
- 15. jquery с ключевым словом или без него
- 16. Вращение NSImage с NSAffineTransform или без него
- 17. SQL - подсчет с подзапросом или без него?
- 18. Узнать MVC3 с DI или без него?
- 19. Профилирование кода с оптимизацией или без него
- 20. Amazon EC2 с EBS или без него?
- 21. если заявление с отрицанием или без него
- 22. ли завод шаблон создать объект только с конструктором по умолчанию
- 23. Как создать объект для класса с только параметризованным конструктором?
- 24. Как помещать объект с конструктором без аргументов в std :: map?
- 25. C++: Проблемы с конструктором
- 26. Проблема с конструктором C++
- 27. Как скопировать объект без ссылки на него?
- 28. объект доступа, созданный конструктором с помощью jquery
- 29. Math не является конструктором, но у него есть
- 30. C# Singleton с конструктором, который принимает параметры
Объекты всегда создаются с помощью конструктора –
Показать код о создании объекта с конструктором или без него. – songyuanyao
Использование круглых скобок делает «вызов» более явным, но конструктор всегда вызывается. –