2016-11-19 2 views
0

В этой небольшой тестовой программы, может кто-нибудь объяснить мне:Указатель на член данных класса

  • Почему каждые адреса печатаются в обоих петлями то же самое?
  • Почему он отличается от одного цикла к другому?

    struct A { 
        A(){ std::cout << &v << "\n"; }; 
        int v; 
    }; 
    
    int main() 
    { 
        std::vector<A> vec; 
    
        int i = 10; 
        while (i--) 
         vec.push_back(A()); 
    
        for (A b : vec) 
         std::cout << &(b.v) << "\n"; 
    
        while (true); 
        return 0; 
    } 
    

Я на самом деле ожидал увидеть десять различных адресов повторяется 2 раза

+2

Потому что 'b' является * копией * векторного элемента, а не самого векторного элемента. –

+1

Попробуйте 'для (A & b: vec)', чтобы увидеть адрес в 'vector'. –

+0

Большое спасибо, я чувствую себя очень глупым .. – Treycos

ответ

1

Если вы хотите видеть те же адреса, вам нужно посмотреть адреса внутри вектора, а не адреса временных копий.

С vector::emplace_back вы можете видеть адреса внутри вектора во время строительства (см. emplace_back). Справочный доступ дает вам адрес внутри вектора во время итераций.

int main() 
{ 
    std::vector<A> vec; 

    int i = 10; 
    while (i--) 
     vec.emplace_back(); 

    for (const A& b : vec) 
     std::cout << &(b.v) << "\n"; 
    ... 
} 
1

В этом диапазоне на основе цикл:

for (A b : vec) 
     std::cout << &(b.v) << "\n"; 

b является копией элемента в векторе. Вот почему вы видите в 10 раз тот же адрес. Он отличается для двух разных циклов, потому что эта копия находится в другом месте памяти. Вы, наверное, хотели это:

for (A& b : vec) 
     std::cout << &(b.v) << "\n"; 

здесь b является ссылкой на элемент в векторе.