C отправляет ссылку?

#c #pointers #reference

#c #указатели #ссылка

Вопрос:

предположим, у меня есть:

 template<class S, class T>
class node
{
public:
  S key;

  node(const Samp; key)
    : key(key)
  {}
};
 

Сохранит ли это новый экземпляр key или просто укажет на тот, который был отправлен в качестве параметра функции?

Я не уверен, так как, с одной стороны, я отправляю ссылку «своего рода указатель», с другой стороны, ключ не является указателем, поэтому должен быть создан новый экземпляр…

Комментарии:

1. В key(key) нем будет скопировано key this->key .

2. Тип переменной-члена говорит всю правду.

3. с точки зрения реализации ссылка является своего рода указателем. Однако, для того, что такое ссылка, имхо, это скорее помогает понять, что ссылка — это ссылка, а указатель — указатель. Они не совпадают

4. Если вы не уверены, напишите класс, который печатает что-то из конструктора, копирует конструктор, перемещает конструктор и т. Д. И Посмотрите , что произойдет. Но да, S key это объект и должен быть скопирован из ссылочного параметра.

Ответ №1:

Код совершенно нормальный, но использование key дважды затрудняет описание того, что происходит. Итак, небольшая модификация для обсуждения:

 template<class S, class T>
class node {
public:
    S m_key;

node(const S amp;key) : m_key(key){}
};
 

key (аргумент) является ссылкой. Это означает, что S объект, используемый в качестве аргумента, не копируется в key . Однако m_key (элемент) не является ссылкой. m_key должны быть инициализированы node конструктором. Для этого S копируется объект, на который ссылается key m_key .

Из этого могут быть исключения, если S это немного необычный тип. Например, S может быть сам ссылочный тип : node<const intamp;, void> .

Ответ №2:

Чтобы быть абсолютно уверенным, посмотрите на адреса объектов. Разные объекты имеют разные адреса, а один и тот же объект имеет один и тот же адрес.

 template<class S, class T>
class node
{
public:
  S key;

  node(const Samp; key)
    : key(key)
  {}
};
    
int main()
{
    int x = 1;
    node<int,int> n(x);
    std::cout << amp;x << "n";
    std::cout << amp;(n.key) << "n";
}
 

Возможный вывод :

 0x7ffec1abb16c
0x7ffec1abb168
 

Ссылка — это просто псевдоним для другого объекта. key С другой стороны, ваш член является объектом типа S (не ссылкой), следовательно, он не может быть тем же объектом, что и тот, на который ссылается параметр конструктора. В приведенном выше примере элемент инициализируется значением x .

Комментарии:

1. 463035818 даже не простое число

2. @AyxanHaqverdili немного забавно, что до сих пор никто не жаловался на первую часть имени: P

3. Ну, немного глупо говорить что-то вроде «2 ^ 19937 — 1 — большее простое число», когда 463035818 даже не является простым числом для начала. Может быть, поэтому никто не жалуется на первую часть: D

4. @AyxanHaqverdili хм, хорошо, может быть, это только второй по величине. Может произойти отключение по одному

Ответ №3:

Значение параметра key копируется в this->key . Следовательно, это не один и тот же объект, а 2 идентичных объекта в разных ячейках памяти. Если вы хотите, чтобы они были одним и тем же объектом, я рекомендую использовать указатели в этом сценарии, например:

 template<class S, class T>
class node
{
public:
  S *key;

  node(const Samp; key)
    : key(amp;key)
  {}
};
 

Комментарии:

1. «но 2 идентичных объекта» я бы предпочел сказать «два объекта с равным значением», потому что идентификатор обычно относится к одному и тому же объекту, в то время как после a = b; ожидания это a == b