Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.12.2013, 14:36   #11
Smogg
Участник клуба
 
Регистрация: 14.06.2011
Сообщений: 1,138
По умолчанию

Цитата:
Сообщение от nikmoon Посмотреть сообщение
Почему-то мой компилятор такое не проглатывает.
1. но при его определении ругается, что такой конструктор создать нельзя
А как вы его определяете?
Цитата:
2. Если определить функцию ret() так, чтобы она возвращала ссылку, компилятор ругается на возврат локальной переменной.
Т.е. ни в каком случае GCC-4.8.1 не позволяет вернуть локальный объект.

Нет, вру. 2 случай лишь предупреждение, т.е. в принципе работает.
Если возвращаете ссылку на локальный объект, то этот объект должен быть static. Потому что статичные переменные - они как глобальные. Также создаются на этапе запуска программы и существуют в единственном экземпляре вплоть до завершения, только область видимости у них ограничена пределами функции, где объявлены.

Цитата:
И вообще оказалось достаточно объявить
Код:
const ClsA ret() {...}
Работает даже без ссылки.
У меня работающего GCC нету, так как не смог добиться от QtCreatora адеквата, и проверить не могу.
Можете объяснить, как и на что здесь повлиял модификатор const?
Smogg вне форума Ответить с цитированием
Старый 04.12.2013, 15:19   #12
nikmoon
Форумчанин
 
Регистрация: 13.11.2013
Сообщений: 149
По умолчанию

Вот такой конструктор не проходит.
Код:
class MyClass
{
public:
  ...
  MyClass(MyClass);
}
Цитата:
Если возвращаете ссылку на локальный объект, то этот объект должен быть static.
Что-то не заметил в первом посте никакого static
Цитата:
Можете объяснить, как и на что здесь повлиял модификатор const?
С помощью const я говорю компилятору, что не буду использовать возвращаемое значение в качестве lvalue, что как раз недопустимо, но допустимо использовать качестве rvalue. Что самое интересное, после объявления
Код:
const ClsA ret() {...}

int main()
{
  ClsA a = ret();
}
не вызывается ни конструктор копирования, ни оператор присваивания, лишь обычный конструктор, но это, видимо, оптимизация компилятора.

p.s. Чуть оффтопа. Попробуйте Eclipse + CDT + MinGW. После этого на VS мне не захотелось возвращаться.

Последний раз редактировалось nikmoon; 04.12.2013 в 15:26.
nikmoon вне форума Ответить с цитированием
Старый 04.12.2013, 16:46   #13
Smogg
Участник клуба
 
Регистрация: 14.06.2011
Сообщений: 1,138
По умолчанию

Цитата:
Сообщение от nikmoon Посмотреть сообщение
Вот такой конструктор не проходит.
Код:
class MyClass
{
public:
  ...
  MyClass(MyClass);
}
VS требует чтоб конструктор копирования объявлялся как MyClass(MyClass &); и никак по-другому

Вот это тоже мне не понятно, что это за фигня - & в объявлении?

И чем тогда отличаются объявления:
MyClass func( MyClass );
MyClass & func( MyClass );
MyClass func( MyClass &);
MyClass &func( MyClass &);
M?

Цитата:
Что-то не заметил в первом посте никакого static


Цитата:
Что самое интересное, после объявления
Код:
const ClsA ret() {...}

int main()
{
  ClsA a = ret();
}
не вызывается ни конструктор копирования, ни оператор присваивания, лишь обычный конструктор, но это, видимо, оптимизация компилятора.
Не, это не оптимизация, а глюк компилятора
VS считает, что const MyClass & и просто MyClass & - это разные типы, поэтому дополнительно должен быть явно определен и конструктор от константы:
Код:
class MyClass
{
public:
  ...
  MyClass(MyClass &);
  MyClass(const MyClass &);
}
Цитата:
p.s. Чуть оффтопа. Попробуйте Eclipse + CDT + MinGW. После этого на VS мне не захотелось возвращаться.
Ежели VS полноценнокряканутая и с прикрученным Visual Aassist X'ом, то для С++ вполне неплохо. Главное, не нужны пляски вокруг настроек компилятора и дебаггера. Все в комплекте.
Хотя да, под VS я пиратствую

Как нибудь поиграюсь и с Эклипсом
Smogg вне форума Ответить с цитированием
Старый 04.12.2013, 16:54   #14
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

Цитата:
Сообщение от Smogg Посмотреть сообщение
Не, это не оптимизация, а глюк компилятора
VS считает, что const MyClass & и просто MyClass & - это разные типы, поэтому дополнительно должен быть явно определен и конструктор от константы:
Код:
class MyClass
{
public:
  ...
  MyClass(MyClass &);
  MyClass(const MyClass &);
}
Если у нас есть const конструктор копирования, то не-const не нужен.
Разница между MyClass и MyClass& более-менее такая же, как между MyClass и MyClass*
waleri вне форума Ответить с цитированием
Старый 04.12.2013, 18:34   #15
Smogg
Участник клуба
 
Регистрация: 14.06.2011
Сообщений: 1,138
По умолчанию

Цитата:
Сообщение от Smogg Посмотреть сообщение
Не, это не оптимизация, а глюк компилятора
VS считает, что const MyClass & и просто MyClass & - это разные типы, поэтому дополнительно должен быть явно определен и конструктор от константы:
Код:
class MyClass
{
public:
  ...
  MyClass(MyClass &);
  MyClass(const MyClass &);
}
А вот и фиг:warning C4521: 'ClsA' : multiple copy constructors specified
При этом вызывается всегда только один конструктор. Сonst конструктор копирования вызывается лишь при отсутствии не-const'ого.
Цитата:
Сообщение от waleri Посмотреть сообщение
Разница между MyClass и MyClass& более-менее такая же, как между MyClass и MyClass*
То есть все то же самое, только при образщении к членам вместо "->" используется "."? Смысл? Опасно ж...
Я всегда думал, что "." - это признак объекта, существующего только в пределах данной функции, а "->" - подсказывает, что этот объект - где-то там, неизвестно где и менять его вредно.
Smogg вне форума Ответить с цитированием
Старый 04.12.2013, 20:03   #16
nikmoon
Форумчанин
 
Регистрация: 13.11.2013
Сообщений: 149
По умолчанию

Ссылка MyClass& безопаснее и удобнее, чем указатель MyClass*.
Простой пример: тебе нужно передать в функцию объект, функция может менять объект, значит есть два варианта это сделать: передать по ссылке и передать по указателю. В случае передачи по указателю, внутри функции очень желательно проверять его на NULL. Если передавать по ссылке такая проверка не нужна.
nikmoon вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Конструктор класса не хочет принимать в качестве параметра адрес объекта другого класса Jugger Помощь студентам 3 05.01.2012 04:10
[c++] Создание класса. Используя конструктор. Actimel Помощь студентам 2 03.01.2012 11:54
передача функции в конструктор класса Kukurudza Общие вопросы C/C++ 6 04.12.2011 08:31
Конструктор шаблонного класса Hemul Общие вопросы C/C++ 1 01.07.2011 20:21
Конструктор класса XPAiN Общие вопросы Delphi 2 24.01.2010 15:00