Как получить возвращенную ссылку на вектор? - PullRequest
0 голосов
/ 15 ноября 2018

Я нашел два способа получить ссылку, возвращаемую функцией.

vector<int> vec1 = {4,5,6};

vector<int>& rtn_vec(void)
{
    return vec1;
}

int main()
{
    vector<int> &vec2 = rtn_vec(); //way 1
    vector<int> vec3 = rtn_vec(); //way2

    vec2[0] = 3;

    return 0;
}

Я понимаю, что способ 1 означает передачу ссылки на vec1 на &vec2, поэтому vec2[0] = 3; меняет vec1 на {3,5,6}.

Но по поводу пути 2 у меня есть 2 вопроса:

  1. Почему я могу передать ссылку (vector<int>&) на экземпляр (vector<int>), как это работает?

  2. Включает ли способ 2 глубокое копирование? Потому что я запускаю этот код и vector<int> vec3 = rtn_vec(); кажется просто скопировать vec1 в vec3.

Ответы [ 2 ]

0 голосов
/ 15 ноября 2018

Когда вы копируете конструкцию vec3, создается поверхностная копия (C ++ на самом деле не делает "глубокую" копию). Все элементы вектора копируются по значению , как и любая другая копия std::vector.

0 голосов
/ 15 ноября 2018
vector<int> vec3 = rtn_vec(); //way2

Это выделяет новый вектор и вызывает конструктор копирования, так что да, это «глубокая» копия.

На самом деле, это ничем не отличается от простого написания

vector<int> &vec2 = vec1;
vector<int> vec3 = vec1;

Или, чтобы сделать вещи еще яснее

vector<int> &return_value = vec1;
vector<int> &vec2 = return_value;
vector<int> vec3 = return_value;

(Хотя будьте осторожны с термином "глубокий". Если бы он был vector<int*>, то были бы скопированы только указатели, а не сами int.)

...