今天在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;不能通过编译 这是为什么,难道类对象就有特权吗??

解决方案 »

  1.   

    我是这样理解的,int 属于普通数据类型,就其具体就像一个正整数付值给另外一个正整数,如
    11 = 11
    编译当让会错了。如果理解错了,不要扁呀。
      

  2.   

    不知道呀,nnd其实这好像有点钻牛角尖了谁这样写代码阿,不被项目经理骂死才有鬼呢,呵呵不过既然有人提出了问题,偶们也就多个心眼吧,嘿嘿原帖在这
    http://community.csdn.net/Expert/topic/4433/4433667.xml?temp=8.948916E-02
      

  3.   

    哈,我的看法和楼上的一致。
    如果你写一个类,没有拷贝和赋值函数,那么this->Getaa() = "aa";就不能通过编译了。
      

  4.   

    我的理解
    int CMyDlg::Getbb()返回的是一个int常数
    CString CMyDlg::Getaa()返回的是一个CString类型的临时变量
      

  5.   

    int就不能有临时变量了,真不公平啊
      

  6.   

    嘻嘻,看楼主求知欲这么强,就给你讲讲吧引用操作符的出现,使得函数作为左值成为可能,如下例子:int cc=0;
    int &test()
    {
        return cc;
    }
        test()=10;
    这时候你会发现cc变成10了,为什么?我们知道,引用是指“别名”的意思,test函数中返回cc引用,那么就意味着返回值就是cc变量!这个cc变量是可以读写的,这就是引用的好处,引用在重载等号的时候会经常用到这样,回到楼主的问题,int& CMyDlg::Getbb()
    {
    int aa = 11;
    return aa;
    }
    这样就编通了,但是虽然编译通过了,返回值确是一个已经过了生存周期的变量(aa),这样的赋值时非常危险的!
    至于第一个为什么能够编译通过,实在是因为CString重载了n多的构造函数和赋值函数的缘故
      

  7.   

    CString中有ctor和operator= 等
      

  8.   

    this->Getaa() = "aa";其实是调用了CString的=重载函数,int没有这个函数。