Je vais vous montrer quelques exemples :
Premier exemple, ne pas renvoyer d'objet de portée locale, par exemple :
const string &dontDoThis(const string &s)
{
string local = s;
return local;
}
Vous ne pouvez pas retourner local
par référence, car local
est détruit à la fin du corps de dontDoThis
.
Deuxième exemple, vous pouvez renvoyer par référence :
const string &shorterString(const string &s1, const string &s2)
{
return (s1.size() < s2.size()) ? s1 : s2;
}
Ici, vous pouvez renvoyer par référence les deux s1
y s2
car ils ont été définis avant shorterString
a été appelé.
Troisième exemple :
char &get_val(string &str, string::size_type ix)
{
return str[ix];
}
code d'utilisation comme ci-dessous :
string s("123456");
cout << s << endl;
char &ch = get_val(s, 0);
ch = 'A';
cout << s << endl; // A23456
get_val
peut retourner des éléments de s
par référence parce que s
existe toujours après l'appel.
Quatrième exemple
class Student
{
public:
string m_name;
int age;
string &getName();
};
string &Student::getName()
{
// you can return by reference
return m_name;
}
string& Test(Student &student)
{
// we can return `m_name` by reference here because `student` still exists after the call
return stu.m_name;
}
exemple d'utilisation :
Student student;
student.m_name = 'jack';
string name = student.getName();
// or
string name2 = Test(student);
Cinquième exemple :
class String
{
private:
char *str_;
public:
String &operator=(const String &str);
};
String &String::operator=(const String &str)
{
if (this == &str)
{
return *this;
}
delete [] str_;
int length = strlen(str.str_);
str_ = new char[length + 1];
strcpy(str_, str.str_);
return *this;
}
Vous pourriez alors utiliser le operator=
au-dessus comme ça :
String a;
String b;
String c = b = a;