Синтаксис инициализации объекта в 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иначе у вас неопределенное поведение.

Другие вопросы по тегам