2013-08-19 3 views
3

Je suis de fond C et essayer de comprendre ce que cela signifie:Attribution/références dans la fonction Initialiser args

void f(const string &x = "hello") { 
} 

Est-x ensemble à une valeur par défaut si rien ne se passe dans? Où réside "bonjour"?

+0

Vous pourriez être intéressé par quelque chose comme [Accelerated C++] (http://www.informit.com/store/accelerated-c-plus-plus-practical-programming-by-example-9780201703535). – chris

Répondre

2

Ce sont les paramètres par défaut que vous apprendrez si vous visitez le this link.

Un paramètre par défaut est un paramètre de la fonction qui a une valeur par défaut qui lui sont fournies. Si l'utilisateur ne fournit pas de valeur pour ce paramètre , la valeur par défaut sera utilisée. Si l'utilisateur fournit une valeur pour le paramètre par défaut, la valeur fournie par l'utilisateur est utilisée.

Donc, si vous appelez f comme ça -

f(); 

alors x contiendra hello, mais si vous l'appelez comme ça -

f("test"); 

alors x contiendra test.

+1

@Prime: Eh bien, c'était une faute de frappe. Je l'ai réparé. –

6

Votre paramètre (x) est créé/initialisé dans le contexte de la fonction appelante. La chaîne littérale `" hello "a une durée de stockage statique. La norme ne spécifie pas la forme de mémoire dans laquelle l'un de ces éléments est stocké, mais dans un cas typique, la chaîne littérale réside dans une mémoire qui est initialisée directement à partir des données dans le fichier exécutable et x sera créé sur la pile (avec l'adresse du littéral passée pour l'initialiser si vous ne passez pas autre chose à sa place).

0

Cette déclaration de paramètre équivaut à plus explicite suivante

void f(const string &x = string("hello")) 

Vous avez raison: la partie après la = (que l'on appelle argument par défaut) est utilisé lorsque la fonction est appelée sans argument explicite , comme dans

f(); 

dans ce cas, est construit à partir "hello" initialiseur et ensuite utilisé un objet temporaire de type string en tant qu'initialisateur pour la référence x. La construction de cette est effectuée temporaire dans le cadre du code d'appel, ce qui signifie que l'appel ci-dessus est équivalente à

f(string("hello")); 

Pour répondre à votre question sur "hello": "hello" est une chaîne littérale qui a une durée de stockage statique (c.-à- il réside dans la mémoire statique, tout comme dans C). Mais encore une fois, notez que dans cet exemple ce n'est pas "hello" lui-même qui est utilisé comme un initialiseur pour la référence. Dans ce cas, le compilateur créera implicitement un objet temporaire string de courte durée sans nom à cette fin, comme l'expliquent explicitement mes exemples ci-dessus.

Questions connexes