今天在c++板瞎逛,偶然的机会看到有人问到关于函数返回作为左值的问题
于是做了如下试验CString CMyDlg::Getaa()
{
CString aa = "123";
return aa;
}int CMyDlg::Getbb()
{
int aa = 11;
return aa;
}void CMyDlg::OnButton1()
{
this ->Getaa() = "aa";
this->Getbb() = 11;
}发现this->Getaa() = "aa";能通过编译,
this->Getbb() = 11;不能通过编译 这是为什么,难道类对象就有特权吗??
于是做了如下试验CString CMyDlg::Getaa()
{
CString aa = "123";
return aa;
}int CMyDlg::Getbb()
{
int aa = 11;
return aa;
}void CMyDlg::OnButton1()
{
this ->Getaa() = "aa";
this->Getbb() = 11;
}发现this->Getaa() = "aa";能通过编译,
this->Getbb() = 11;不能通过编译 这是为什么,难道类对象就有特权吗??
11 = 11
编译当让会错了。如果理解错了,不要扁呀。
http://community.csdn.net/Expert/topic/4433/4433667.xml?temp=8.948916E-02
如果你写一个类,没有拷贝和赋值函数,那么this->Getaa() = "aa";就不能通过编译了。
int CMyDlg::Getbb()返回的是一个int常数
CString CMyDlg::Getaa()返回的是一个CString类型的临时变量
int &test()
{
return cc;
}
test()=10;
这时候你会发现cc变成10了,为什么?我们知道,引用是指“别名”的意思,test函数中返回cc引用,那么就意味着返回值就是cc变量!这个cc变量是可以读写的,这就是引用的好处,引用在重载等号的时候会经常用到这样,回到楼主的问题,int& CMyDlg::Getbb()
{
int aa = 11;
return aa;
}
这样就编通了,但是虽然编译通过了,返回值确是一个已经过了生存周期的变量(aa),这样的赋值时非常危险的!
至于第一个为什么能够编译通过,实在是因为CString重载了n多的构造函数和赋值函数的缘故