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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 10.11.2011, 14:41   #1
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию Как правильно возвращать созданный в функции объект?

допустим функция создаёт строку std::string . как правильно и оптимизированно возвратить этот объект?

сейчас, я делаю так.
Код:
std::string ConverttoString(params)
{
	std::string res = * new std::string;
	////////code
	return res;
}
это правильно?
rpy3uH вне форума Ответить с цитированием
Старый 10.11.2011, 15:14   #2
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

ну есть 4 варианта, как вернуть объект из функции:
1. явный возврат. у объекта должен быть реализован конструктор копирования
2. возврат ссылки/указателя на статический объект
3. возврат ссылки указателя на глобальный объект (или на член класса)
4. непосредственное изменение объекта, переданный по ссылке/указателю через входящий параметр

каждый вариант зависит от ситуации. вектор к примеру, яб не возвращал явно, только через входящий ссылочный параметр. std::string можно и явно вернуть

пс. твой код неверен
Код:
std::string ConverttoString(params)
{
	std::string res;
        // code
	return res;
}
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 10.11.2011, 15:47   #3
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

Код:
std::string ConverttoString(params)
{

}

void mainfunc()
{
   std::string str = ConverttoString(data);
   //объект str удалять не надо, он должен сам удалиться как любой другой статический объект
}
нужен вариант без конструктора копирования. нужен самый быстродействующий вариант
rpy3uH вне форума Ответить с цитированием
Старый 10.11.2011, 16:15   #4
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Возвращать указатель, в функции получать его через new. Если строк известное число, может быть проще использовать глобальный массив.
Abstraction вне форума Ответить с цитированием
Старый 10.11.2011, 16:19   #5
Son Of Pain
Участник клуба
 
Регистрация: 23.12.2010
Сообщений: 1,129
По умолчанию

1) Можно возвращать просто объект как он есть.
Код:
string func()
{
string res=...;
return res;
}
Тут происходит копирование объекта. Раньше это могло быть проблемой, но теперь компиляторы умеют делать return value optimization, исключая временный объект в тривиальных случаях. Еще раньше так не стоило возвращать "тяжелые" объекты типа векторов, но после реализации правосторонних ссылок и move semantics из нового стандарта это тоже перестало быть проблемой.

2) Можно создавать объект в динамической памяти (new), и возвращать указатель на него. Тогда копирования не будет, но можно будет случайно забыть освободить память. Потому стОит возвращать shared_ptr в общем случае. Ну и работа с памятью тоже занимает время, об этом не нужно забывать.

3) Можно передавать готовую переменную для возвращаемого значения:
Код:
void func(string& res)
{
res=...;
}

...
string s;

func(s);
Это и будет наиболее эффективным решением в твоем случае, похоже - ни лигшних вызовов конструкторов, ни работы с памятью.

P. S. разные извращенные варианты вроде возвращения указателей на статические объекты в общем случае категорически противопоказаны.

P. P. S. А вообще, раз ты начал задаваться такими вопросами, стОит почитать какую-то хорошую книжку по c++. Мейерса, например.
Son Of Pain вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не знаю как правильно сделать вызов функции Homutova_Julia Помощь студентам 14 07.06.2011 23:45
как правильно назвать фу-ю чтобы возвращать фалсе SaNeKBF C# (си шарп) 4 18.05.2011 08:51
ООП - получить еще не созданный объект в дочернем классе Cronos20 PHP 7 30.11.2010 01:09
onkeydown. Как правильно передать в обработчику объект? Stilet JavaScript, Ajax 2 24.11.2010 13:15
Из потока прочитать созданный в программе объект. DIgorevich Общие вопросы Delphi 3 30.08.2010 08:16