QString str = "abc";
qDebug()<<__FILE__<<"["<<__LINE__<<"]"<<str;
str.replace('a','b');
qDebug()<<__FILE__<<"["<<__LINE__<<"]"<<str;
QString &QString::replace(QLatin1String before, QLatin1String after, Qt::CaseSensitivity cs = Qt::CaseSensitive)
"abc"
"bbc"
函数返回值时会产生一个临时变量作为函数返回值的副本,而返回引用时不会产生值的副本。
1.不可以返回局部对象的引用
函数执行完毕,程序将释放分配给局部对象的存储空间。此时,对局部对象的引用就会执行不确定的内存。
2.
const string &shorterString(const string &s1,const string &s2)
{
return s1.size()<s2.size()?s1:s2;
}
以上函数的返回值是引用类型。无论返回s1还是s2,调用函数和返回结果时,都没有拷贝这些string对象。
3.返回this指向的对象。
在类的成员函数中,返回引用的类对象,一般为this指向的对象。
4.返回this的成员变量
重要的是,函数的返回值如果是引用,那么不可以引用即将被析构的变量。
QString str = "abc";
qDebug()<<__FILE__<<"["<<__LINE__<<"]"<<str<<&str;
QString str1 = str.replace('a','b');
qDebug()<<__FILE__<<"["<<__LINE__<<"]"<<str1<<&str1;
"abc" 0x97fdd0
"bbc" 0x97fdcc
引用赋值给变量
QString str1 = str.replace('a','b');
分析这句:
str.replace('a','b');得到的是QString&
这里应该又进行了赋值操作,得到了新的QString,所以str和str1的地址是不同的。
另一个例子:
int m = 1;
int &m1 = m;
int m2 = m1;
qDebug()<<__FILE__<<"["<<__LINE__<<"]"<<&m << &m1 <<&m2;
0x97fdac 0x97fdac 0x97fda8