看到2005年的关于函数return的类型和函数返回值的类型,和赋予值的类型要求一个帖子

a043028448 2009-09-27 12:53:53
先 贴原帖:
提问者:
/////////////////////////////////////////////////////////////
#include <iostream>
//using namespace std;为什么包含std就编译不过了呢?
template<class T>
class MyType
{
T value;
public:
T getValue()
{
return value;
}
MyType()
{
value=0;
printf("in the default construct\n");
}
MyType(T val)
{
value=val;
printf("in the construct\n");
}
friend const MyType<T> operator +(const MyType<T> & obj1,const MyType<T>& obj2);
friend const MyType<T> operator -(const MyType<T> & obj1,const MyType<T>& obj2);
const MyType<T> & operator =(const MyType<T> & obj)
{
value=obj.value;
return *this;
}

};

template <class T>
const MyType<T> operator+(const MyType<T> & obj1,const MyType<T> & obj2)
{
return MyType<T>(obj1.value+obj2.value);
}
template <class T>
const MyType<T> operator-(const MyType<T> & obj1,const MyType<T> & obj2)
{
return obj1.value-obj2.value;
//奇怪把obj1.value-obj2.value明明是T形的变量为什么返回以后变成
//const MyType<T>了呢?return obj1.value-obj2.value调用了构造函数,为什么呢?
}


int main()
{
MyType<int> s1(10), s2(-5), s3;
MyType<double> s4(10.3), s5(5.2), s6;
s3 = s1 + s2;
s6 = s4 - s5;
printf(" s1.value = %d s2.value = %d s3.value = %d \n", s1.getValue(), s2.getValue(), s3.getValue());
printf(" s4.value = %2.1f s5.value = %2.1f s6.value = %2.1f\n", s4.getValue(), s5.getValue(), s6.getValue());
return 0;
}


一个被奉为仙人的回答者的回答:

我想指出您的程序中几个问题:
  1. friend const MyType<T> operator +(const MyType<T> & obj1,const MyType<T>& obj2);
    friend const MyType<T> operator -(const MyType<T> & obj1,const MyType<T>& obj2);
    const MyType<T> & operator =(const MyType<T> & obj)
    {
     value=obj.value;
     return *this;
    }
    这三个运算符重载函数返回类型为const MyType<T>,这是有很大隐患的.以operator=()为     列,*this原类型为MyType<T>,返回类型为const MyType<T> &,所以该复制赋值函数的左值就    只能为const MyType<T>,导致该左值以后的操作有极大的限制
    运算符返回类型常常为非const引用或原类型

////////////////////////////我的问题///////////////////////////////////////////////////////////////////////////
我的问题是。。我实验了 复制赋值函数的左值 可以不为const的
我认为是将return的值的类型转化成函数的返回值的类型。放在赋值的等式右面。左面还是不受const的限制的,因为const的值能够赋给非const的值
...全文
88 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
cphj 2009-09-27
  • 打赏
  • 举报
回复
部分更正:

另外对于仙人的回答其他内容,我认为有问题
operator+()和operator-()和operator=()不一样,它们本就应该返回const MyType <T>,这样才是和内建类型是一致的
cphj 2009-09-27
  • 打赏
  • 举报
回复
仙人的回答说“极大的限制”,这个略微有点过,其实
const MyType<T> & operator=(const MyType<T> & obj)
只会限制某些链式表达式
class A
{
public:
const A & operator=(const A & r)
{
return *this;
}
};

int main()
{
int x, y, z;
x = y = z; //OK
(x = y) = z; //OK

A a, b, c;
a = b = c; //OK
(a = b) = c; //compiling error
return 0;
}

改成
A & operator=(const A & r)
上述的编译错误也就消失了,类型A和内建类型的表达式规则也一致了


另外对于仙人的回答其他内容,我认为有问题
operator+()和operator-()和operator=(),它们本就应该返回const MyType<T>,这样才是和内建类型是一致的

64,646

社区成员

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

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