原问题: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;;
}
};
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;;
}
};
=========================
this就对象指针,类型当然出错了。
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;
}
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是指针,所以不对。