2015-07-12 4 views
1
#include <iostream> 

void test(std::string &s) { 
    std::string p = s; 
    std::cout << p.length() << " " << p; 
} 

int main() { 
    std::string s = "Hello world"; 
    test(s); 

    return 0; 
} 

Таким образом, функция test получает ссылку на мою строку s от моей функции main.Что происходит, когда я присваиваю объекту значение ссылки в C++?

Мой вопрос, что же эта линия сделать:

std::string p = s;

его неполную копию ссылки и поместить ли его в p, тем самым поражение цели с помощью ссылки в первую очередь?

Или он (p) просто действует как ссылка?

+2

копия конструктор _lvalue_ будет называться, если это _shallow copy_ зависит от его реализации. Это довольно непонятно, о чем вы действительно спрашиваете. –

+0

Выполняет глубокую копию, если строки с копированием на запись отключены. – James

+2

Забудьте о «мелком» или «глубоком» копировании. Он просто копирует объект, на который ссылается ссылка. Семантика копии - это то, что определено для типа копируемых объектов (в данном случае, 'std :: string'.) – juanchopanza

ответ

2

Он создает копию значения ссылки, он не позволяет редактировать содержимое s с p, чтобы сделать p выступать в качестве ссылки и иметь возможность редактировать s от p, вы должны объявить он в качестве ссылки:

std::string& p = s; 
+0

Другими словами, 'std :: string' ведет себя так же, как' int' в этом отношении. Это одна из приятных вещей в C++ - эта последовательность. 'int p = i' создаст новый' int', инициализированный копией 'i', поэтому вопросник не должен ожидать, что' std :: string p = s' будет отличаться. –

1

того самого поражения цели с помощью ссылки в первую очередь?

Зачем он побеждает цель ссылки, вы указали s в качестве справки, не так ли? Не p. Таким образом, как отмечено, он копирует значение, которое содержит s.

1

Что происходит, когда я присваиваю объекту значение ссылки в C++?

Вы не можете назначить значение ссылки или, по крайней мере, вы не должны думать в таких терминах. Ссылка не указатель. Случается, что вы назначаете значение объекта, потому что ссылкой является объект, доступ к которому осуществляется через другое имя.

void test(std::string &s) { 

Тот факт, что вы имеете дело с упоминанием только действительно актуальны на момент заявления. Весь код в этой функции, который использует s, использует std::string, а не std::string &.

Мой вопрос, что делает эту линию не делают:

std::string p = s; 

Он назначает ваш std::string объект p, ни больше, ни меньше. Другими словами, он делает то же самое, как это было бы в этой программе:

int main() { 
    std::string s = "Hello world"; 

    std::string &s_with_different_name = s; 
    std::string p = s_with_different_name; 
    std::cout << p.length() << " " << p; 
} 

Или, что еще проще, в этом:

int main() { 
    std::string s = "Hello world"; 

    std::string p = s; 
    std::cout << p.length() << " " << p; 
} 
Смежные вопросы