0) Мы не делаем этого "статического класса" в C ++.Это хитрости, связанные с тем фактом, что Java и C # заставляют вас помещать весь ваш код в классы.C ++ этого не делает, поэтому мы не должны обходить ограничения, которых не существует.Классы не являются местом хранения кода;они существуют для определения типа данных .Что вы действительно пытаетесь сделать, так это организовать код, сгруппировав его под общим именем;мы делаем это с namespace
.
1) Вы не можете возвращать ссылку на локальную переменную.Ссылки предназначены для возврата уже существующих вещей.
2) Вы не хотите возвращать ссылку, потому что цель createMessageBox
- создать aокно сообщения.Вы возвращаете значение: окно сообщения, которое было создано.
3) Когда вы пишете
Foo bar = нечто ();
результат из something()
равен скопировано , , даже если something()
действительно вернул ссылку на уже существующую вещь.Это потому, что тип bar
равен Foo
, а не Foo&
.bar
должен иметь свой собственный Foo
;это не может относиться к одному, потому что это не ссылка.И так как Foo
, возвращаемое something()
, является самостоятельным значением, с его собственным расположением в памяти, мы не можем просто заставить его быть "быть" bar
;программа должна сделать копию.
Чтобы обратиться к результату функции, вы должны написать Foo& bar = something();
.Это продлит срок жизни возвращаемого объекта (который обычно сразу выходит из области видимости), поэтому нет проблем с обращением к временному.
4) Однако оптимизирующие компиляторы умны,и это вряд ли вам что-нибудь даст .Если вы просто возвращаете значение и присваиваете по значению, шансы хороши, что копирование на самом деле не произойдет (хотя стандарт говорит, что ваш код должен быть подготовлен к такой возможности).
5) Динамическое распределениечестно, очень плохая идея здесь.Если вы должны сделать это, по крайней мере, используйте какую-нибудь оболочку смарт-указателя.Хотя, когда ваш конструктор копирования отключен, иногда вы застреваете с такими вещами.: /