[20分]刚解决类的构造问题,还有一点疑问

boyzhang 2008-09-16 08:32:16
原问题:http://topic.csdn.net/u/20080916/07/0eaa3e47-0a83-4e44-a773-d406ed5b8f40.html

问题是解决了,可是,还有一点我不明白,为什么不能这样写呢?

//拷贝构造函数
myClass(myClass &obj)
{
this=obj.local_string;
}

他不是应该自动掉用类里面的运算符重载吗?

可是我这样写他不让我编译通过.
说是类型的问题,我对c++的类型一向很晕,
希望那位兄弟能给指点一下.

这样每种构造函数写一遍分配内存,再复制字符串岂不是太不美观了?


#include<iostream>
using namespace std;


//定义类
class myClass
{
//定义字符串类型
typedef char* string;

//私有
private:
string local_string;
//取常数字符串长度
int Length(const string lpSrc)
{
//计算字符串长度
int nSize=0;
while(lpSrc[nSize]) nSize++;
return(nSize);
}
//公有
public:
//取当前字符串长度(重载)
int Length()
{
return(Length(local_string));
}


//无参构造函数
myClass()
{
//初始化变量
local_string=NULL;
cout<<"无参构造函数"<<endl;
}
//有参构造函数
myClass(const string lpSrc)
{
//计算字符串长度
int nSize=Length(lpSrc);
//分配内存
local_string=new char[(nSize+1)];
//复制数据
for(int i=0;i<nSize;i++)
{
local_string[i]=lpSrc[i];
}
//结束标志
local_string[i]=0;
cout<<"有参构造函数"<<endl;
}


//拷贝构造函数
myClass(myClass &obj)
{
/*
//计算字符串长度
int nSize=Length(obj.local_string);
//分配内存
local_string=new char[(nSize+1)];
//复制数据
for(int i=0;i<nSize;i++)
{
local_string[i]=obj.local_string[i];
}
//结束标志
local_string[i]=0;
*/
this=obj.local_string;

cout<<"拷贝构造函数"<<endl;
}



//析构函数
~myClass()
{
if(NULL!=local_string)
{
delete[] local_string;
}
cout<<"析构函数"<<endl;
}


//类赋值运算
myClass& operator=(const myClass &obj)
{
if(this!=&obj)
{
//计算字符串长度
int nSize=Length(obj.local_string);
//分配内存
local_string=new char[(nSize+1)];
//复制数据
for(int i=0;i<nSize;i++)
{
local_string[i]=obj.local_string[i];
}
//结束标志
local_string[i]=0;

}
cout<<"类赋值运算函数"<<endl;
return *this;
}


//常数赋值运算
myClass& operator=(const string lpSrc)
{
//计算字符串长度
int nSize=Length(lpSrc);
//分配内存
//local_string=(char *)malloc((nSize+1) * sizeof(char));
local_string=new char[(nSize+1)];
//复制数据
for(int i=0;i<nSize;i++)
{
local_string[i]=lpSrc[i];
}
//结束标志
local_string[i]=0;

cout<<"常数赋值运算函数"<<endl;
return *this;
}



//取值运算
operator string() const throw()
{
return local_string;;
}
};
...全文
48 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
xsc2001 2008-09-16
  • 打赏
  • 举报
回复
//拷贝构造函数
myClass(myClass &obj)
{
this=obj.local_string;
}
//常数赋值运算
myClass& operator=(const string lpSrc)
{
//计算字符串长度
int nSize=Length(lpSrc);
//分配内存
//local_string=(char *)malloc((nSize+1) * sizeof(char));
local_string=new char[(nSize+1)];
//复制数据
for(int i=0;i<nSize;i++)
{
local_string[i]=lpSrc[i];
}
//结束标志
local_string[i]=0;

cout<<"常数赋值运算函数"<<endl;
return *this;
}

你的上面的函数肯定是不行的,因为this是对象本身,是myClass对象的指针类型,而obj.local_string是myclass的成员,operator=是给引用类型的对象赋值,而你这里用的是this是指针,所以不对。
boyzhang 2008-09-16
  • 打赏
  • 举报
回复
结帐,自己搞定了,写了个私有函数,初始化字符串并复制字符串内容.

//复制字符串
void copy(string &dest,const string src)
{
//计算字符串长度
int nSize=Length(src);
//分配内存
dest=new char[(nSize+1)];
//复制数据
for(int i=0;i<nSize;i++)
{
dest[i]=src[i];
}
//结束标志
dest[i]=0;
}

wltg2001 2008-09-16
  • 打赏
  • 举报
回复
this=obj.local_string;
=========================
this就对象指针,类型当然出错了。

16,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧