Консультация № 19358
07.04.2005, 14:32
0.00 руб.
0 3 3
Никак не могу подружиться с ссылками и с возвращаемыми значениями ф-ций =(
-почему функция, которая возвращает параметр как значение должна сначала сделать копию его а потом возвратить?
-почему при возврате значения как ссылки копия не делается? и делается ли что-то вообще? (по идее должна делать копия переменной представляющей ссылку)
-допустим у нас есть класс с открытыми методами достуап и закрытыми членами-переменними, делаются ли функциями-членами, которые возвращают значение переменных-членов, копии переменных(обьектов)-членов перед тем как их возвратить как значения?
вобщем я немного запутался и прошу не судить меня строго, я толька начинаю изучать с++!

Обсуждение

Неизвестный
07.04.2005, 16:14
общий
это ответ
Здравствуйте, ohitmano!
не... погоди... тебе для начала нужно отделить друг от друга понятия параметр и возвр.значение.
1.
значит так:
параметры функции могут передоваться по значению (т.е. функция работает со сзначением параметра)
и по ссылке (ссылку на переменную), т.е. фактически функция получает возможность изменять значения переменных, ей не принадлежащих.
пример1:
int foo(int * a) { return ++(*a); }; // или ++*a, без разницы
void main()
{
int a = 100;
foo(&a); // теперь значение переменной a = 101
}
пример2:
int foo(int a) { return ++a; };
void main()
{
int a = 100;
int b = foo(a); // значение переменной b = 101, a = 100
}
2.
если говорить о возвращении функцией ссылки то нужно понимать, что переменная внутри функции, пренадлежит и существует, только внутри этой самой функции.
здесь функция всётаки вернёт некий адрес, но этой переменной после выхода из функции уже не будет существовать. этот момент можно обойти объявив статическую переменную:
int * foo()
{
static int a = 100;
return &a;
}
т.е. со статическим элементом это прокатит.
а если нужно, чтоб вункция возвращала адрес вновь созданной переменной то так:
int * foo()
{
int * a = (int*) malloc(sizeof(int)); // выделим память
return a;
}
но в этом случае нужно не забыть освободить память от ненужных данных
void main()
{
int * a = foo();
// чего-то с ней делаем
// и когда она нам более не нужна:
free(a);
}
надеюсь доступно объяснил.
удачи!
Неизвестный
08.04.2005, 16:22
общий
это ответ
Здравствуйте, ohitmano!
Ссылка - второе имя переменной. Т.е. под нее не виделяется ни каких ресурсов. Все операции проводимые над ссылкой производяться напрямую над переменной (это происходит на уровне компилятора, до генерации кода).
При вызове ф-ции параметры ей могут передоваться двумя способами:
1. Как адрес переменной (передача по ссылке),
2. Как копия переменной (передача по значению).
В первом случае все операции, произведенные над переменной, сохроняться после выхода из ф-ции.Во втором случае после выхода из ф-ции значение переменной не измениться.
Если что-то не понятно пиши на мыло xaliavka@mail.ru или аська: 282926739
Неизвестный
08.04.2005, 23:16
общий
это ответ
Здравствуйте, ohitmano!
Кажется будет проще показать на паре примеров. При возврате значения как ссылки делается временная переменная-ссылка на возвращаемое значение

Приложение:
Пример 1 - функция просто возвращает значениеint Inc(const int value){ int Temp=value+1; return Temp; // здесь создается копия Temp так как сам Temp // после завершения функции перестает существовать}// ошибка - возвращаем ссылку на временный объект о чем должен сообщить компиляторint& Inc(const int value){ int Temp=value+1; return Temp; // здесь создается копия Temp так как сам Temp // после завершения функции перестает существовать}// передача значения как ссылкиvoid Inc(int& value){ value+=1; // непосредственно изменяем переданное значение // никакие копии не создаются, ничего не возвращаем}Пример 2 (классы)class СSample{ // пропустим конструкторы деструкторы DWORD GetData(void) const {return m_dwData;} // делается копия DWORD& GetData(void){return m_dwData;} // копия не делаетсяprotected:DWORD m_dwData;}const СSample m_objMain;DWORD dwData=m_objMain.GetData(); // вызывается const функция c копиейСSample m_objMain;DWORD dwData=m_objMain.GetData(); // вызывается ссылочная функция без копированияm_objMain.GetData()=10; // изменяется значение protected переменной с помощью той же функции
Форма ответа