Const Int& Vs Int В Качестве Параметра

  • Автор темы qqwertty
  • Дата начала
Q

qqwertty

#1
Собсна и весь вопрос. Есть ли разница между:

void foo(const int& i);
void foo(int i);

Именно для int, для классов понятно, что есть
 
A

artkl

#4
Во втором случае вы передаете значение переменной, в первом ссылку на эту переменную, при этом модифицировать это значение функция не сможет (const). Разница очевидна.
 
Q

qqwertty

#5
Ну так и????

что в первом, что во втором случае размер передаваемого параметра пусть будет 4 байта.
Модифицировать передаваемое ей значение функция один фиг не может.

То что программист захочет потом через 10 лет в foo написать где-нибудь i++; и программа сломается, давайте не учитывать. Это уже бред.
 
A

artkl

#6
1. foo(int i); // Передача значения типа int в функцию
2. foo(int& i); // Передача ссылки (адрес переменной) на значение переменной типа int
3. foo(const int& i); // Передача ссылки (адрес переменной) на константное значение переменной типа int

int ii = 0;
foo(ii);

Если объявлена 1 функция, то создается копия переменной ii и передается в функцию
Если объявлена 2 и 3 функция, то передается лишь ссылка на переменную ii, в следствии чего, функция foo и вызывающая программа работают с одной переменной.

Функция foo сможет изменять значение переменной i, если объявлена как 1 или 2 функция

Для наглядности, по экспериментируй с этим кодом:
C++:
#include <iostream>

//void foo(int i) { i = 3; }
void foo(int& i) { i = 3; }

int main()
{
int i = 0;	
foo(i);

std::cout << i;

system("PAUSE");
return 0;
}
Функции эквивалентные, но результат работы программы совершенно разный.
 
Q

qqwertty

#7
Ладно, видимо вы поддтекст моего вопроса не поняли... Моя вина.

Как лучше писать:
void foo(const int& i);
или
void foo(int i);

без потерь производительности. Или мб "хороший стиль" предполагат что-то одно?
 
A

artkl

#8
Как лучше? Ответ зависит от того, что должна делать функция foo с этой переменной.

В случае, если функции нужно только значение переменной и она не собирается его менять, то, естественно, необходимо объявлять ее как foo(const int& i). Почему? Читай выше.
 
Q

qqwertty

#9
А чего она может с ней делать???? Это же параметр. Использовала и выброила. Я же говорю i++ не рассматриваем.

Например такой код

C++:
class A
{
/*...*/ 
void foo(int i) {a=i;} // or const int&
private:
int a;
};
 
A

artkl

#10
Если функция работает без побочных эффектов, то она принимает копии переменных, иначе ссылки на них.

void foo(int i) {a = i; } <=> void foo(const int& i) {a = i;}
В первом случае произойдет создание копии переменной при вызове, во втором, копия будет создана после неявного приведения типа: const int& -> int. Я придерживаюсь второго варианта, потому что он наиболее точней описывает то, что будет происходить с переменной, после передачи ее в функцию, а именно: значение переменной i не будет изменено.