问个关于重载操作符的问题?请进!

geniuscaobo 2010-06-03 06:52:57


我用CArray,里面的元素是包含一个结构体。当我想改变数组中的某一个位置中结构中的值时。
arr[i] = st; 结果一看MFC中的代码时。


template<class TYPE, class ARG_TYPE>
class CArray : public CObject
{
public:
// overloaded operator helpers
TYPE operator[](int nIndex) const;
TYPE& operator[](int nIndex);

}

template<class TYPE, class ARG_TYPE>
AFX_INLINE TYPE CArray<TYPE, ARG_TYPE>::operator[](int nIndex) const
{ return GetAt(nIndex); }
template<class TYPE, class ARG_TYPE>
AFX_INLINE TYPE& CArray<TYPE, ARG_TYPE>::operator[](int nIndex)
{ return ElementAt(nIndex); }



傻眼了。重载操作符有两个,一个返回引用,一个返回值。 这两个函数分别在什么时候调用?
万一调用第一个,那赋值就不成功了。 谁能解释一下区别和用法。
...全文
129 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
子庚 2010-06-04
  • 打赏
  • 举报
回复
c++
TYPE operator[](int nIndex) const;
当我们声明一个const对象时,它是不能调用类内部的非const方法的.编译器为了防止程序员的粗心规定一个const对象只能调用const成员方法..(是为const对象准备的)


TYPE& operator[](int nIndex);
一个非const对象就是调用这个方法..
相当于这样
a[index] = value;
value = a[index];
返回一个变通引用,很灵活,既能做左值也能做右值..


geniuscaobo 2010-06-04
  • 打赏
  • 举报
回复
根据大家说的情况做了实验,vc6下测试:

template<class TYPE, class ARG_TYPE>
class CIndex : public CObject
{
public:
// overloaded operator helpers
TYPE operator[](int nIndex) const;
TYPE& operator[](int nIndex);

TYPE m_data;
};

template<class TYPE, class ARG_TYPE>
AFX_INLINE TYPE CIndex<TYPE, ARG_TYPE>::operator[](int nIndex) const
{
print("TYPE const \n");
return m_data;
}

template<class TYPE, class ARG_TYPE>
AFX_INLINE TYPE& CIndex<TYPE, ARG_TYPE>::operator[](int nIndex)
{
print("TYPE& \n");
return m_data;
}

//----------------------------
// 非const变量不管怎样调用,都是返回引用

// CIndex<int , int> index;
//
// index[0] = 23; //TYPE&
// int a = index[0]; //TYPE&
//
// const int b = index[0]; //TYPE&
//
// cout << "nihao" << index[0] << endl; //TYPE&
//
// clogger.print("data=%d \n", index[0]); //TYPE&


//----------------------------
// const变量不管怎样调用,都是返回const函数的那个

const CIndex<int , int> index;

// index[0] = 23; //编译不过
int a = index[0]; //TYPE const
const int b = index[0]; //TYPE const
cout << "nihao" << index[0] << endl; //TYPE const
clogger.print("data=%d \n", index[0]);//TYPE const


ls正解
cattycat 2010-06-03
  • 打赏
  • 举报
回复
一个是const函数,返回的变量是const不能修改。
elegant87 2010-06-03
  • 打赏
  • 举报
回复
TYPE operator[](int nIndex) const;
这个是常规的操作,作为右值赋值;例如
int i=array[1];
TYPE& operator[](int nIndex);
引用说明这个值是可以改变的。一般的情况下数组的值是可以改变的
这时候作为左值了。例如
原来array[1]=10;现在又修改array[10]的值 即array[1]=20;
这时候就调用&[]型的
liutengfeigo 2010-06-03
  • 打赏
  • 举报
回复

向LS学习
pengzhixi 2010-06-03
  • 打赏
  • 举报
回复
[Quote=引用楼主 geniuscaobo 的回复:]
我用CArray,里面的元素是包含一个结构体。当我想改变数组中的某一个位置中结构中的值时。
arr[i] = st; 结果一看MFC中的代码时。


template<class TYPE, class ARG_TYPE>
class CArray : public CObject
{
public:
// overloaded operator helpers
TYPE ope……
[/Quote]
当需要修改返回的值时会调用返回引用的,当你作为cout<<输出参数的时候就会调用const成员函数那个
lxdfigo 2010-06-03
  • 打赏
  • 举报
回复
第二个是在赋值给const变量时用的。 编译器会自动找合适的操作符。

64,685

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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