C++ dasturlash tili Ko'rsatgichlar, referatlar va dinamik xotira ajratish


Передача ссылок на функции с аргументами ссылок и аргументами указателя


Download 267.5 Kb.
bet7/14
Sana20.06.2023
Hajmi267.5 Kb.
#1630767
TuriReferat
1   2   3   4   5   6   7   8   9   10   ...   14
Bog'liq
Язык программирования C

Передача ссылок на функции с аргументами ссылок и аргументами указателя

Pass-by-Value

В C/C++ по умолчанию аргументы передаются в функции по значению (за исключением массивов, которые обрабатываются как указатели). То есть создается клонированная копия аргумента, которая передается в функцию. Изменения, внесенные в клонированную копию внутри функции, не влияют на исходный аргумент вызывающего объекта. Другими словами, вызываемая функция не имеет доступа к переменным в вызывающем объекте. Например
/* Pass-by-value into function (TestPassByValue.cpp) */
#include
using namespace std;
int square(int);
int main() {
int number = 8;
cout << "In main(): " << &number << endl; // 0x22ff1c
cout << number << endl; // 8
cout << square(number) << endl; // 64
cout << number << endl; // 8 - no change
}
int square(int n) { // non-const
cout << "In square(): " << &n << endl; // 0x22ff00
n *= n; // clone modified inside the function
return n;
}
Вывод ясно показывает, что есть два разных адреса.
Передача по ссылке с аргументами указателя

Во многих ситуациях мы можем захотеть изменить исходную копию напрямую (особенно при прохождении огромного объекта или массива), чтобы избежать накладных расходов на клонирование. Это можно сделать, передав указатель объекта в функцию, известную как pass-by-reference.
Например
/* Pass-by-reference using pointer (TestPassByPointer.cpp) */
#include
using namespace std;
void square(int *);
int main() {
int number = 8;
cout << "In main(): " << &number << endl; // 0x22ff1c
cout << number << endl; // 8
square(&number); // Explicit referencing to pass an address
cout << number << endl; // 64
}
void square(int * pNumber) { // Function takes an int pointer (non-const)
cout << "In square(): " << pNumber << endl; // 0x22ff1c
*pNumber *= *pNumber; // Explicit de-referencing to get the value pointed-to
}
Вызываемая функция работает с тем же адресом и, таким образом, может изменять переменную в вызывающем объекте.
Pass-by-reference с ссылочными аргументами

Вместо того, чтобы передавать указатели в функцию, вы также можете передавать ссылки в функцию, чтобы избежать неуклюжего синтаксиса ссылок и разыменовывания.
Например
/* Pass-by-reference using reference (TestPassByReference.cpp) */
#include
using namespace std;
void square(int &);
int main() {
int number = 8;
cout << "In main(): " << &number << endl; // 0x22ff1c
cout << number << endl; // 8
square(number); // Implicit referencing (without '&')
cout << number << endl; // 64
}
void square(int & rNumber) { // Function takes an int reference (non-const)
cout << "In square(): " << &rNumber << endl; // 0x22ff1c
rNumber *= rNumber; // Implicit de-referencing (without '*')
}
Опять же, выходные данные показывают, что вызываемая функция работает с тем же адресом и, таким образом, может изменять переменную вызывающего объекта.
Обратите внимание, что ссылки (в вызывающем объекте) и разыменования (в функции) выполняются неявно. Единственное различие в кодировке с pass-by-value заключается в объявлении параметра функции.
Напомним, что ссылки должны быть инициализированы во время объявления. В случае формального параметра функции при вызове функции инициализируются ссылки на аргументы вызывающего объекта.
Ссылки в основном используются при передаче ссылок в / из функций, чтобы позволить вызываемой функции напрямую обращаться к переменным в вызывающем объекте.
"const" Параметры ссылки/указателя функции

Формальный параметр функции не может быть изменен внутри функции. Используйте по возможности, так как это защищает вас от непреднамеренного изменения параметра и защищает вас от многих ошибок программирования.constconst
Параметр функции может принимать как неаргументы, так и неаргументы. С другой стороны, параметр ссылки/указателя, не относящийся к функции, может получать только неаргумент. Напримерconstconstconstconstconst
/* Test Function const and non-const parameter (FuncationConstParameter.cpp) */
#include
using namespace std;
int squareConst(const int);
int squareNonConst(int);
int squareConstRef(const int &);
int squareNonConstRef(int &);
int main() {
int number = 8;
const int constNumber = 9;
cout << squareConst(number) << endl;
cout << squareConst(constNumber) << endl;
cout << squareNonConst(number) << endl;
cout << squareNonConst(constNumber) << endl;
cout << squareConstRef(number) << endl;
cout << squareConstRef(constNumber) << endl;
cout << squareNonConstRef(number) << endl;
// cout << squareNonConstRef(constNumber) << endl;
// error: invalid initialization of reference of
// type 'int&' from expression of type 'const int'
}
int squareConst(const int number) {
// number *= number; // error: assignment of read-only parameter
return number * number;
}
int squareNonConst(int number) { // non-const parameter
number *= number;
return number;
}
int squareConstRef(const int & number) { // const reference
return number * number;
}
int squareNonConstRef(int & number) { // non-const reference
return number * number;
}

Download 267.5 Kb.

Do'stlaringiz bilan baham:
1   2   3   4   5   6   7   8   9   10   ...   14




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling