我们经常可以看到对类型对象直接赋值的情况。比如Cstring是一个类,我们经常用该类提供的函数处理字符串。可也有这种情况:
Cstring str;
str="abcdedf123";
Cstring str="fdsa123123";
还有这样的类对象赋值CColumns cols = GetColumns();
CColumns CDataGrid::GetColumns()
{
LPDISPATCH pDispatch;
InvokeHelper(0x69, DISPATCH_PROPERTYGET, VT_DISPATCH, (void*)&pDispatch, NULL);
return CColumns(pDispatch);
}
在赋值运算中,如int i=8;float j=3.14;分别是赋值让i得到整数值8,j得到浮点值3.14.这种给类对象直接赋值的做法让对象得到什么值,内存情况如何?谢谢~

解决方案 »

  1.   

    例如:const CXXX& operator = (const char c);const CXXX& CXXX::operator = (const char c)
    {
    ...;

    return *this;
    }
      

  2.   

    去看看C++,=赋值运算符可以被重载。 CString就重载了赋值运算符。
    而你贴的那段C++ Code,最后Return那句,调用了构造函数,产生了一个CColumns的临时对象。直接给类对象赋值,一般调用赋值运算符,或者拷贝构造函数。
    如果是初始化的时候,就调用拷贝构造函数。否则调用赋值运算符。
      

  3.   

    楼上各位,没有在CColumns 这个类下看到有构造函数和“=”操作符重载的函数哦。为什么?
    看看Cstring类的重载“=”操作符函数吧:
    const CString& CString::operator=(LPCTSTR lpsz)
    {
    ASSERT(lpsz == NULL || AfxIsValidString(lpsz));
    AssignCopy(SafeStrlen(lpsz), lpsz);
    return *this;
    }
    AfxIsValidString和AssignCopy的代码我就先不贴了,坐等高人分析下csring重载的这个“=”操作符的作用和实现。
      

  4.   

    坐等高人来说说cstring的重载“=”操作符函数
      

  5.   

    这个和普通函数有什么区别吗?
    他的返回值是地址,前面加了 const 就是表示这个指针是一个常量
    AssignCopy(SafeStrlen(……
    这个函数是怎么工作,你看下就知道了吧,别的和普通的函数没什么区别啊重要的应该是你对符号重载不清楚吧,不明白啥为符号重载,去看下c++基础,里面有讲符号重载,说得很清楚还有CString不是数据类型,他是一个类,是class,只是这个类使用频率很高,所以他是不需要实例化的我是菜鸟,请达人指点
      

  6.   

    没有“=”,编译器会默认给一个,就是memcpy。
    没有构造函数,编译器也会默认给一个,就是什么也不做。
      

  7.   

    楼已经盖得很高了,可问题依然迷糊。这位的回答稍微有点关联:
    说没有看到“=”的重载函数,其实MFC会自动默认一个memcpy类似的功能来做赋值。
    另外,我对操作符重载了解不是很透彻,知道重载操作符是不改变该操作符的原本意义,写个函数来重载扩展他的功能。
    一个不是太复杂的问题为什么弄这么久?给类的对象赋值到底赋值了什么?内存如何?
      

  8.   

    这样换一下是不是好懂一点呢
    const CString&  CString::optEqual(LPCTSTR lpsz)
    {
    ASSERT(lpsz == NULL || AfxIsValidString(lpsz));
    AssignCopy(SafeStrlen(lpsz), lpsz);
    return *this;
    }
    其实 "="这相当于函数名,只是用”=“更符合习惯
    普通的变量用”=" 我觉得变成汇编会容易理解一些,mov  xx , yy 应该是这种指令吧,我也没做过试验
    CString b("aa");
    CString a=b;  可以看作是a.optEqual(b);另外,可能重载运算符返回CString&会让你迷惑(我就是被这个迷惑的)
    其实变成
    void  CString::optEqual(LPCTSTR lpsz)
    {
    }
    也是可以的。
    只是这样的话就不能实现连=了
    例如
    a=b=c;编译会提示出错;
    a=b;还是可以用的。
      

  9.   

    做这个事情的不是MFC,是编译器。
    不是,重载操作符,就是让人看起来跟符合习惯而已。
    比如:a=b和a.assign(b),哪个看起来更好理解?
    重载操作符的时候,可以在里面随便写什么东西,这么写只不过是符合人的习惯,让代码读起来更方便而已。
    你所谓的赋值实际就是“=”的意义而已,因为操作符重载的原因,这个东西在C++里可以是任何意义。
      

  10.   

    这个不对吧,和一般函数一样,只是不能改变操作数的个数。
    =操作符,不重写的话就是按位拷贝。如果类中有个指针变量p,那=后两个对象的p指向同一个东西。这在析构时会有问题,你只delete掉一个,但另一个的指针也无效了。这个叫浅度拷贝么?
    重写的=操作符就是要解决这个问题。
    条款11: 为需要动态分配内存的类声明一个拷贝构造函数和一个赋值操作符
    Effective C++里详细地讲了这个