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++就是这样的.....继续研究.....
//定义类
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++就是这样的.....继续研究.....
相关文章推荐
- ISO C++ operator 重载类型转换时对指针的重要约束!
- ISO C++ operator+ 重载方法
- C++重载operator的示例
- C++文件输入输出流的一点经验
- C++模板及operator重载测试实例(vs 2008)
- 关于C++中覆盖,重载,隐藏的一点说明
- 走进C++程序世界-----operator new delete 重载
- C++重载operator的示例
- C++重载赋值运算符 Overload assignment(=)operator
- c++学习记录:operator = 重载
- C++重载operator的示例
- 运算符重载 编程题#2(Coursera 程序设计与算法 专项课程3 C++程序设计;重载:& operator-)
- 基于C++中覆盖,重载,隐藏的一点重要说明
- C++中重载operator( )构成仿函数
- c++ operator重载的例子
- c c++ 中 结构体内成员 位域的 一点经验【2013.10.11小记】
- C++重载类型转换操作符(type cast operator
- C++本质:类的赋值运算符=的重载,以及深拷贝和浅拷贝(我又对其中一点点错误进行了一点修改)
- 关于重载C++中String operator +和+=中内存泄漏
- C++重载operator的示例