Le passage des chaînes par référence et la valeur en C++
Je veux déclarer une chaîne de caractères, l'initialiser par le passage par référence, et ensuite de le passer par la valeur de l'outputfile fonction.
Le code ci-dessous fonctionne, mais je ne sais pas pourquoi. Dans le principal je m'attends à passer le string 'nom de fichier' comme
startup(&filename)
Mais qui donne une erreur, et le code ci-dessous ne fonctionne pas. Pourquoi? Aussi, est-il une meilleure façon de le faire sans l'aide d'une valeur de retour?
#include <iostream>
#include <string>
using namespace std;
void startup(std::string&);
void outputfile(std::string);
int main()
{
std::string filename;
startup(filename);
outputfile(filename);
}
void startup(std::string& name)
{
cin >> name;
}
void outputfile(std::string name)
{
cout << name;
}
&filename
crée un pointeur. Les pointeurs et les références sont incompatibles.- Pourquoi ne veux-tu pas utiliser une valeur de retour?
- Le code "fonctionne" parce que c'est exactement ce que vous avez décrit. dans votre phrase d'ouverture, et fait si bien. Concernant l'erreur avec
&filename
, il ne devrait pas compiler, car une référence n'est pas un pointeur. Voir cette question et les réponses. quant à leurs différences et leurs similitudes.
Vous devez vous connecter pour publier un commentaire.
Votre code fonctionne comme prévu.
&filename
retourne l'adresse mémoire de (aka un pointeur vers)filename
, maisstartup(std::string& name)
veut une référence, pas un pointeur.Les références en C++ sont simplement passés à la normale "passage par valeur" syntaxe:
startup(filename)
prendfilename
par référence.Si vous avez modifié le
startup
fonction de prendre un pointeur vers unstd::string
à la place:void startup(std::string* name)
puis vous passerez à l'aide de l'adresse de l'opérateur:
startup(&filename)
Comme une note de côté, vous devriez également faire l'
outputfile
prise de fonction de son paramètre par référence, car il n'y a pas besoin de copier la chaîne. Et puisque vous n'êtes pas modifier le paramètre, vous devez le prendre comme unconst
référence:Pour plus d'info, ici sont les règles du pouce pour C++ concernant la manière de passer les paramètres de la fonction.