#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