2010-06-03 6 views
1

Une question rapide:les variables Passing aux fonctions

Quand je passe une variable à une fonction, ce que le programme faire une copie de cette variable à utiliser dans la fonction? Si c'est le cas et que je savais que la fonction ne lirait que la variable et ne l'écrirait jamais, est-il possible de passer une variable à la fonction sans créer de copie de cette variable ou devrais-je laisser cela optimisations de compilateur pour le faire automatiquement pour moi?

+3

Quel manuel C++ utilisez-vous qui ne couvre pas cela en détail? –

+0

Quel manuel? – Faken

+2

C'est le problème. :) Vous devriez apprendre d'un bon manuel, nous avons une grande liste ici: http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list – GManNickG

Répondre

6

Oui, les paramètres transmis par valeur sont copiés. Cependant, vous pouvez également passer des variables par référence. Une référence est un alias, ce qui fait du paramètre un alias à une variable plutôt qu'une copie. Par exemple:

void foo(int x) {} 
void bar(int& x) {} 

int i; 

foo(i); // copies i, foo works with a copy 
bar(i); // aliases i, bar works directly on i 

Si vous marquez comme const, vous avez une lecture seule alias:

void baz(const int&); 

baz(i); // aliases i, baz reads-only i 

En général, toujours passer par const-référence. Lorsque vous avez besoin de modifier l'alias, supprimez le const. Et enfin, quand vous avez besoin d'une copie, il suffit de passer par la valeur. *

* Et en règle générale, les types fondamentaux (int, char *, etc.) et les types avec sizeof(T) < sizeof(void*) doivent être transmis par valeur à la place de const-référence, parce que leur taille est assez petite pour que la copie soit plus rapide que l'aliasing.

2

Oui, c'est le cas.
Si vous savez que vous pouvez passer l'argument const & comme ceci:

int function(const string& str) {} 

Pour les petits types comme int ou flotter ou char cela ne vaut pas la peine depuis le passage d'une référence est le même que le passage d'un int. Cela n'a de sens que si vous passez de grandes choses comme vector s ou string s.

Le compilateur ne va probablement pas faire cette optimisation pour vous parce que dans la plupart des cas, il ne peut pas savoir qu'il est autorisé à le faire.

0

Si vous utilisez des références, seul un alias est passé. Si vous ne le faites pas, une copie sera faite. Cela dépend de ce que vous devez faire avec les variables. Si vous avez besoin d'utiliser les paramètres, mais pas les modifier, une référence const est la meilleure solution (efficacité et sémantique), sauf peut-être pour les très petits types.

1

Si la fonction reçoit des variables par copie, oui le programme ne fait une copie:

void function(int pass_by_value); 

Si la fonction reçoit des variables par référence, non, le programme ne fait pas une copie, mais utilise la variable d'origine:
void function2(int & pass_by_reference);

Si la fonction ne modifie pas la variable, la fonction doit recevoir une référence constante:
void function3(const int & pass_by_constant_reference);

En général, les classes et les structures doivent être transmises par référence constante. Les types POD (plain old data) peuvent être transmis par valeur.

En C++, vous devez indiquer au compilateur et aux utilisateurs de vos fonctions, comment vous voulez que les variables soient passées et si elles seront modifiées ou non.

0

Dans la référence const (const &) case ok dans la fonction, vous pouvez utiliser la valeur de la variable réelle, aucune copie n'est générée, mais vous ne pouvez pas modifier la valeur de la variable d'origine, à cet effet, utilisez & ou (*) dans la définition de la fonction, les appels de fonction sont les suivantes:

myFunction (x) ou myFunction (& x)

it helps :)

Başak Bilgi

Questions connexes