Синтаксис инициализации объекта в C++
Я заметил несколько странных ошибок, когда пытался инициализировать конструкторы. Проще всего показать им.
#include <iostream>
class MyClass {
public:
int var1, var2, var3;
MyClass() {
var1, var2, var3 = 0;
}
MyClass(int one, int two, int three) {
var1 = one;
var2 = two;
var3 = three;
}
};
int main()
{
MyClass object1(5, 6, 7);
std::cout << object1.var1; // This works
MyClass object2();
std::cout << object2.var1; //Error object must have class type.
MyClass object3 = MyClass();
std::cout << object3.var1; //Now it works for some reason
delete &object1;
MyClass ojbect1(5, 6, 7); //error redefinition; multiple initialization
}
Как вы можете видеть, по какой-то причине, когда я инициализирую object2, значения не будут напечатаны, если, как и в случае с object3, синтаксис не будет записан как MyClass object3 = MyClass();
Кроме того, когда я удаляю object1, я должен использовать оператор &. Это удивило меня, учитывая, что в этом вопросе при удалении объекта в C++ они не используют амперсанд.
Наконец, когда я пытаюсь повторно инициализировать myobject, компилятор жалуется, что существует несколько определений. Я попытался опустить ключевое слово MyClass, но оно по-прежнему не позволяло.
Теперь я, конечно, могу заставить программу делать то, что я хочу, с помощью различных обходных путей, но я не понимаю, почему эти вещи не могут быть выполнены так, как я их написал здесь.
2 ответа
MyClass object2();
std::cout << object2.var1;
не работает с object2
анализируется как "функция, которая не принимает аргументов и возвращает MyClass
Msgstr "См. Самый неприятный синтаксический анализ: почему A a(()); не работает?
delete &object1;
является причиной неопределенного поведения. Вы можете delete
только объекты, которые были созданы с использованием new
,
MyClass object1(5, 6, 7);
это проблема, как сказал компилятор. Вы не можете повторно объявить имя в той же области видимости. Если вы хотите, чтобы оно имело новое значение, вы можете использовать:
object1 = MyClass(5, 6, 7);
MyClass myobj2();
Это не то, что вы думаете. Он объявляет функцию с именем myobj2
который возвращает MyClass
,
MyClass myobj(5, 6, 7);
Вызывает ошибку, потому что даже если вы удалите myobj
прежде, он все еще объявлен как тип MyClass
, Удаление объекта не отменяет объявление переменной. Если вы удалили его и хотите воссоздать, сделайте это:
myobj = MyClass(5,6,7);
Однако удаление локального объекта - нонсенс. Вам не нужно удалять объект, который в любом случае будет удален после выхода из области видимости. На самом деле вы должны только delete
объекты, которые были созданы с помощью new
иначе у вас неопределенное поведение.