考慮以下場景:
#include <iostream>
#include <string>
using namespace std;
struct Person {
string name;
int age;
};
class Manager{
private:
Person person;
public:
Person get_person(){
return person;
}
};
int main(int argc, char *argv[]) {
Manager m;
m.get_person().name="SkyFire";
m.get_person().age=24;
Person p=m.get_person();
cout<<p.name<<endl<<p.age<<endl;
return 0;
}
這段代碼想用get接口返回管理的對象,然後修改其內部值,但是這段代碼不能達成目的,而且編譯都不會通過,因為返回的對象並不是實際管理的對象,而是person對象的副本了。
但是如果將Person get_person()這個接口改為Person& get_person(),那這段代碼就沒什麼問題了。此時返回的是person對象的引用,可以直接改變其值。
另外,考慮一種情況:
#include <iostream>
#include <string>
using namespace std;
struct Person {
string name;
int age;
};
void func(Person p){
}
int main(int argc, char *argv[]) {
Person p;
//對p進行一些操作,改變name的值,使它的長度足以影響到效率
func(p);
return 0;
}
這個函數在調用時,會將p復制一份,這回使效率大打折扣,所以建議改成:
#include <iostream>
#include <string>
using namespace std;
struct Person {
string name;
int age;
};
void func(const Person &p){
}
int main(int argc, char *argv[]) {
Person p;
//對p進行一些操作,改變name的值,使它的長度足以影響到效率
func(p);
return 0;
}