您的位置:首页 > 编程语言 > C语言/C++

ISO C++ operator= 重载的一点经验

2008-08-03 12:05 197 查看
最近在写一个类,很郁闷的是需要重载=操作符,在网上找了很久都没有很好的教程,只有自己去摸索,起初的代码是这样写的:

//定义类

class CString

{

public:

CString();

~CString();

CString& operator= (const CString&);

int Lenght();

char* _char();

private:

char* value;

unsigned int strsize;

};

CString& CString::operator= (const CString& str)

{

if(this == &str)

return *this;

int len = strlen(str._char()); //问题就在这里

delete this->value;

this->value = new char[len + 1];

memset(this->value,0,len + 1);

memcpy(this->value,str._char(),len); //问题还在这里出现

this->strsize = len;

return *this;

}

就是在编译时提示19行和24行错误:将 ‘const CString’ 作为 ‘char* CString::_char()’ 的 ‘this’ 实参时丢弃了类型限定

搜遍网络也没有能够找到关于operator=重载的相关详细的教程.在自己的瞎摸下,发现被operator=重载时传递给(const CString& str)竟然可以访问他的私有成员,原因是什么,我到现在也不清楚,因为这个成员变量不是全局的而且operator=重载也不是友元的,而且还不能被声明为友元.(如果有高手知道是何缘故,希望赐教小弟)

言归正传,问题就出在我调用了str的成员函数_char(),导致传递的const CString的this丢了.开始我不知道是可以访问其私有成员的,在走头无路时,我无意的试了试访问其私有成员,当时我想既然他会导致传递的this指针丢失,那么他一定传递了一个this指针,this指针可以访问私有成员的,于是直接访问str的私有成员变量value,最后成功了.真是无奈的要死......

虽然可以实现CString对象赋值给CString对象,但是不知道我这样直接访问其私有成员是否会导致后遗症.比如这样就可以直接访问一个对象的私有成员,会不会带来不安全代码问题.还是Linux的ISO C++就是这样的.....继续研究.....
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: