const 问题

BirdWang 2001-12-06 09:07:14
我写了一个类
class CTest1
{
public:
CTest1(){};
~CTest1(){};

CTest1( const CTest1& Src );
CTest1& operator=(const CTest1& Src );

//???
const CArray<int, int>& GetArray()const{return m_aArray;};

private:
CArray<int, int> m_aArray;
};

在cpp中的实现:
CTest1& CTest1::operator=(const CTest1& Src )
{
if( this == &Src ) return *this;
m_aArray.Copy( Src.GetArray() );
return *this;
}

可以编译通过,当在标记处的函数形式是:
const CArray<int, int>& GetArray(){return m_aArray;};

CArray<int, int>& GetArray()const{return m_aArray;};

CArray<int, int>& GetArray(){return m_aArray;};
的三中情况均不能通过编译,提示
error C2440: 'return' : cannot convert from 'const class CArray<int,int>'
to 'class CArray<int,int> &' Conversion loses qualifiers

定义成最上面的两个const的形式后才编译通过,但我不能理解这是什么原因和
这样定义的意思。请多多指教!

顺便问一句,为什么这个问题我最高只能给34分?
...全文
52 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
Last_Dodo 2001-12-06
  • 打赏
  • 举报
回复
因为 CTet1 &operator=(const CTest1 &Src)中的const,所以
m_aArrray.Copy(Src.GetArray())
中的Src.GatArray()一定不允许改变Src本身。唯一能保证Src不被改变的办法是GetArray()是const. 也就是说第二个const是必须的。
有了第二个const,你就必须要第一个const. 否则它返回的引用可以被用来改变它的值。错误信息指的就是这。const的函数内,this是const的。它所有的data member都是const的,你的"return m_aArray;"返回的是const CArray&。如果没有第一个const,compiler就得把它转换成CArray&。

BirdWang 2001-12-06
  • 打赏
  • 举报
回复
可是,m_aArray的Copy的const参数不是在代入时自动转换吗?
如:int t; //定义void test( const int& ii );
test( t ); 也会正确吗?
还有不能改变内容的不是在最前面写const的吗?
我只知道指针的情况,在星号前是不能改变指针所指的内容,
const在星号后是不能改变指针的值。
可以给我一个详细的说明吗?谢谢!
realsweat 2001-12-06
  • 打赏
  • 举报
回复
第一个Const是因为m_aArray这个函数需要const的参数,第二个const是因为你的operator=需要const的参数,如果你不定义第二个const的话,那么表示GetArray是可以改变Src的,与你的定义operator=定义不符,所以要加一个const。
BirdWang 2001-12-06
  • 打赏
  • 举报
回复
Thanks

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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