C ++, строки и указатели - PullRequest
2 голосов
/ 16 февраля 2012

Я знаю, что это элементарно, но я ничего не знаю о C ++. Нужно ли делать:

string *str = getNextRequest();

вместо

string str = getNextRequest();

чтобы потом ссылаться на str в том же блоке кода? Если да, то какой тип ошибки возникнет у последнего?

Ответы [ 5 ]

10 голосов
/ 16 февраля 2012

Это полностью зависит от типа возвращаемого значения getNextRequest.

. Строки могут использоваться и повторно использоваться во всей области, в которой они объявлены. По сути, они содержат изменяемую строку C и некоторую информацию для обработки, вспомогательные методыи т. д.

Вы можете очень безопасно вернуть строку из функции, и компилятор сделает копию или переместит ее при необходимости.Эту строку (str здесь) можно затем использовать обычным образом, не беспокоясь об использовании локальных объектов вне области видимости или подобных.

Бывают случаи, когда необходим указатель на строку, но если вы неесли использовать его в качестве параметра out, они, как правило, встречаются редко и указывают на некоторую странность дизайна.

0 голосов
/ 16 февраля 2012

Возможно, вам потребуется предоставить немного больше информации об этой функции getNextRequest (). Откуда это? Библиотека? API? Цель

Если возвращаемым типом функции является строка * (указатель на str), то строка выделяется для "кучи". Это означает, что не имеет значения, из какого блока кода вы ссылаетесь на строку. Пока вы поддерживаете указатель, вы сможете получить к нему доступ.

Если возвращаемый тип функции - просто строка (имеется в виду не указатель), он вернет значение, а не адрес строки str. По сути, вы будете «копировать» строку в новую переменную. В этом случае переменная будет размещена в стеке, и вы сможете ссылаться на нее только в области действия блока кода.

0 голосов
/ 16 февраля 2012

string str * = getNextRequest ();

Как отмечает @dasblinkenlight, это будет синтаксическая ошибка

Но чтобы ответить на ваш оригинальный вопрос, нужно ли это? В общем, вы не должны использовать указатели, если вы не должны.

Особенно с STL. STL не предназначен для использования с указателями - он выполняет динамическое управление памятью для вас. Если у вас нет веских причин, вы всегда должны использовать vector<int> v и string s вместо vector<int>* или string*.

0 голосов
/ 16 февраля 2012
string str = getNextRequest();

создаст копию string, возвращенную getNextRequest. Если вы хотите изменить содержимое str и хотите, чтобы эти изменения также были в пределах строки, возвращаемой getNextRequest, вы должны вернуть указатель или ссылку.

Если это то, что вы хотите, тогда вы должны определить getNextRequest как:

string& getNextRequest()

и используйте его как:

string& str = getNextRequest();
0 голосов
/ 16 февраля 2012

То, что вы используете, зависит от того, что возвращает getNextRequest (). Если он возвращает string *, тогда используйте первую строку, если он возвращает string, тогда используйте вторую.

Так что если объявление getNextRequest выглядит так:

string getNextRequest();

Тогда

string str = getNextRequest();

правильно. Если объявление выглядит так:

string *getNextRequest();

Тогда вы можете пойти с

string *str = getNextRequest();

или

string str = *getNextRequest();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...