myclass Var1; // конструктор по умолчанию
myclass Var2 = Var1; // в случае конструктора копирования myclass(const myclass &);
myclass Var2 = &Var1; // твой конструктор
OOP. References.
Сразу извиняюсь, если вопрос ламерский, но я пока что не особо силен в ООП. кто знает, в чём отличие ссылок от указателей? В одной книге прочитал, что "reference is an alias to variable". Ну и что? Не может же быть единственным отличием то, что со ссылочной переменной синтаксис тот же, что и с обычной, а с указателем надо использовать операторы * и -> . При написании copy-constructor разве нельзя его объявить как myclass(const myclass *defmc)?
Если объявить конструктор копирования так, как предлагаешь ты, придется писать код так:
Код:
Синтаксис такой же, как и при работе с непосредственно переменной, а физически ссылка есть указатель. Т. е. ссылка - это неявный указатель.
В чем преимущества перед передачей самих значений и перед передачей указателя?
1. Передавать по ссылке удобнее, чем указатель, т. к. легче писать a вместо *a, или a.x() вместо a->x().
2. Передавать по ссылке быстрее и компактнее, чем саму переменную, т. к. физически происходит передача указателя, который обычно имеет строго фиксированный размер независимо от объекта, на который он указывает. Естественно, лучше передать 4 байта адреса на объект, чем передавать копию очень большого объекта.
3. Передача по ссылке некоторого значения в функцию позволяет изменять это значение внутри функции, причем изменяться будет оригинал значения, а не его копия, как в случае с передачей по значению. Вот, к примеру
Код:
void plus (int a, int b)
{
a += b;
}
void plus1 (int &a, int b)
{
a += b;
}
void main (void)
{
int variable = 5;
plus (variable, 2);
cout << variable; // Будет выведено 5
plus1 (variable, 2);
cout << variable; // Будет выведено 7
}
{
a += b;
}
void plus1 (int &a, int b)
{
a += b;
}
void main (void)
{
int variable = 5;
plus (variable, 2);
cout << variable; // Будет выведено 5
plus1 (variable, 2);
cout << variable; // Будет выведено 7
}
Как видим, вызов функции plus не повлиял на значение передаваемой переменной variable, т. к. при её вызове фактически создается копия переменной и функция изменяет эту копию, оставляя оригинал неизменным. А функция plus1 в качестве параметра берет ссылку на эту переменную и через эту ссылку изменяет оригинальное значение.