我们经常可以看到对类型对象直接赋值的情况。比如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.这种给类对象直接赋值的做法让对象得到什么值,内存情况如何?谢谢~
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.这种给类对象直接赋值的做法让对象得到什么值,内存情况如何?谢谢~
解决方案 »
- 关于MFC中树控件的选中焦点问题
- 如何在保存Jpeg时设定图片质量
- directshow 、RTC)API 、VFW、VIS H.323 DLL Library有什么区别
- Microsoft Visual C++ 2008 Express Edition
- 如何实时接收服务器向我发送的数据?
- 我的程序发布了
- 我用mfc做一个控件XXX,准备在网页上调用,请问从网页如何传递参数给控件XXX呢?是通过控件属性吗?请问添加属性是在类CXXXCtrl中添加,
- MFC初学一个奇怪问题
- 在多文档/视图中,在取文档模板中的一个文档时需用到CDocTemplete::docname,请问 此值是在何处注册的?
- 我正在看Com的编程,有事请教。
- 如何获取web页面上mediaplayer的数据
- 这是中断吗?
{
...;
return *this;
}
而你贴的那段C++ Code,最后Return那句,调用了构造函数,产生了一个CColumns的临时对象。直接给类对象赋值,一般调用赋值运算符,或者拷贝构造函数。
如果是初始化的时候,就调用拷贝构造函数。否则调用赋值运算符。
看看Cstring类的重载“=”操作符函数吧:
const CString& CString::operator=(LPCTSTR lpsz)
{
ASSERT(lpsz == NULL || AfxIsValidString(lpsz));
AssignCopy(SafeStrlen(lpsz), lpsz);
return *this;
}
AfxIsValidString和AssignCopy的代码我就先不贴了,坐等高人分析下csring重载的这个“=”操作符的作用和实现。
他的返回值是地址,前面加了 const 就是表示这个指针是一个常量
AssignCopy(SafeStrlen(……
这个函数是怎么工作,你看下就知道了吧,别的和普通的函数没什么区别啊重要的应该是你对符号重载不清楚吧,不明白啥为符号重载,去看下c++基础,里面有讲符号重载,说得很清楚还有CString不是数据类型,他是一个类,是class,只是这个类使用频率很高,所以他是不需要实例化的我是菜鸟,请达人指点
没有构造函数,编译器也会默认给一个,就是什么也不做。
说没有看到“=”的重载函数,其实MFC会自动默认一个memcpy类似的功能来做赋值。
另外,我对操作符重载了解不是很透彻,知道重载操作符是不改变该操作符的原本意义,写个函数来重载扩展他的功能。
一个不是太复杂的问题为什么弄这么久?给类的对象赋值到底赋值了什么?内存如何?
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;还是可以用的。
不是,重载操作符,就是让人看起来跟符合习惯而已。
比如:a=b和a.assign(b),哪个看起来更好理解?
重载操作符的时候,可以在里面随便写什么东西,这么写只不过是符合人的习惯,让代码读起来更方便而已。
你所谓的赋值实际就是“=”的意义而已,因为操作符重载的原因,这个东西在C++里可以是任何意义。
=操作符,不重写的话就是按位拷贝。如果类中有个指针变量p,那=后两个对象的p指向同一个东西。这在析构时会有问题,你只delete掉一个,但另一个的指针也无效了。这个叫浅度拷贝么?
重写的=操作符就是要解决这个问题。
条款11: 为需要动态分配内存的类声明一个拷贝构造函数和一个赋值操作符
Effective C++里详细地讲了这个