Рассмотрим следующий код:
std::vector &MyClass::getVector() const
{
return (myVec);
}
void aFunc()
{
std::vector *vec = &myClassInstance.getVector();
}
На какой адрес указывает vec? Указывает ли это на сам адрес myVec в объекте myClassInstance? (кстати, я знаю, что должен вернуть const ref, но это пример).
Вы возвращаете ссылку на myVec
в методе getVector
, Когда вы берете адрес ссылки, вы получаете адрес переменной, на которую ссылается ссылка. Так vec
будет содержать адрес myVec
,
Ссылка — это псевдоним другой переменной. Когда вы возвращаете ссылку наmyVec
от getVector()
тогда вы можете рассмотреть вызов функции точно так же, как доступ к myVec
если бы это было публично доступно.
&MyClass.myVec == &myClassInstance.getVector()
На какой адрес указывает vec?
Адрес myClassInstance.getVector()
будет таким же, как адрес myVec
,
Также обратите внимание, что, так как вы возвращаете ссылку на lvalue, вы можете даже использовать ее в левой части назначения, например
myClassInstance.getVector() = some_other_vector;
И сейчас myVec
будет копия some_other_vector
,
Да, это указывает на самый вектор myVec в вашем экземпляре MyClass. Смотрите следующий пример кода:
#include <cstdio>
#include <vector>
class MyClass {
std::vector<int> myVec;
public:
MyClass() {}
~MyClass() {}
std::vector<int>& getVector()
{
return myVec;
}
void printVector() const
{
for(std::vector<int>::const_iterator it = myVec.begin(); it != myVec.end(); ++it)
{
printf("%d ", *it);
}
printf("\n");
}
};
int main(int, char**)
{
MyClass item;
std::vector<int>* vec = &(item.getVector());
vec->push_back(1);
item.printVector();
return 0;
}
Запуск этой программы приведет к выводу:
$ ./a.out
1
Таким образом, вы можете увидеть, что призвание getVector()
возвращает ссылку на myVec
из экземпляра MyClass, так как мы добавляем новый элемент в вектор (vec->push_back(1)
) через vec
затем указатель напечатает вектор экземпляра MyClass, и он показывает, что элемент, который мы добавили, находится в myVec
,