разница:
MyClass obj1;
MyClass *obj2;
Здесь obj1 является экземпляром MyClass.
В то время как obj2 потенциально может содержать адрес экземпляра MyClass.
Также obj1 будет автоматически инициализироваться конструкторами, в то время как obj2 не инициализируется по умолчанию (и, следовательно, указывает на случайную память). После инициализации obj2 может принимать специальное значение NULL, которое указывает, что оно не указывает на объект.
obj2 = &obj1;
Здесь мы инициализируем obj2, чтобы он указывал на адрес в памяти obj1. Если вы измените какой-либо из членов obj1, вы сможете увидеть изменения, посмотрев на них через obj2 (но поскольку obj2 является указателем, вам нужно отменить ссылку).
obj1.plop = 5;
std::cout << obj1.plop << "\n";
std::cout << obj2->plop << "\n"; Should print the same values.
На самом деле следующие две вещи:
MyClass obj;
obj = MyClass("123");
- Первая строка инициализирует 'obj' конструктором по умолчанию.
- Вторая строка: создает временный объект, построенный со строкой «123». Как только этот временный объект создан, он копируется в 'obj' с помощью оператора присваивания. Если вы не определили оператор присваивания, компилятор сгенерирует его для вас. Если ваш класс содержит указатели, то версия по умолчанию, вероятно, не будет работать правильно (в большинстве других ситуаций оператор присваивания по умолчанию должен работать нормально).
Эта строка, вероятно, работает:
MyClass obj = MyClass("123123123");
Поскольку компилятор оптимизировал это в:
MyClass obj("123123123");