2016-11-25 3 views
-6

Я нашел код онлайн для C++ Chat Server. А в коде ниже содержит что-то я не получаюЗвездочка в виде функции

string* buildPrompt() 
{ 
// Code for chat server 
} 

Что такое, что звездочка после string? Если я удалю его, перестанет ли работать код?

+6

Да .... 'string' и' string * '- это не одно и то же. Вы должны учиться C++. – Rakete1111

+0

@ Rakete1111 Я выучил C++ ... Но я не помню, как наставник говорил что-нибудь о звездочке после типа. – BoeNoe

+1

http://www.cplusplus.com/doc/tutorial/pointers/ – OldProgrammer

ответ

2

Asterisk после string означает, что это указатель на объект string где-то еще в памяти. Удаление звездочку изменяет тип возврата из функции:

string* buildPrompt(); // <-- Returns pointer to a string. 
string buildPrompt(); // <-- Returns an instance of a string. 

Я бы рекомендовал делать некоторые базовые показания на указатели в C++, они довольно фундаментальное значение для языка, как только вы заранее от простого «Hello, World!» программы.

https://en.wikipedia.org/wiki/Pointer_(computer_programming)

1

Звездочка в вашем примере привязывается к типу возврата и указывает, что функция возвращает указатель на экземпляр строки.

Если вы удалили звездочку, это означало бы, что вы возвращали экземпляр строки по значению.

Так звездочка означает, что тип является указателем на любой тип он подключен к, так int* является типом, который является указателем на int, в то время как int** указатель, который является указателем на int, и так на.

Чтобы получить доступ к экземпляру строки, возвращенному в качестве указателя, вы должны разыменовать его, либо добавив возвращаемое значение с помощью *, либо получив доступ к элементам, используя «оператор стрелки» (->). Так код:

string* str = buildPrompt(); 
cout << *str << endl; 
cout << (*str).c_str() << endl; 
cout << str->c_str() << endl; 

будет выводить тот же текст в три раза, в первом примере мы derefence класса и вывести значение в нем, пути пропускания разыменованного указателя на перегруженном оператор operator<< для string на ostream. Во втором примере мы сначала разыскиваем указатель и обращаемся к вызову функции-члена c_str в этом экземпляре. Третий пример делает то же самое, но использует оператор «стрелка».

Помните, что указатель может быть нулевым, и в этом случае разыменование приведет к неприятностям. Поэтому вы всегда должны проверить, есть ли указатель nullptr перед разыменованием его.

Смежные вопросы