看到2005年的关于函数return的类型和函数返回值的类型,和赋予值的类型要求一个帖子
先 贴原帖:
提问者:
/////////////////////////////////////////////////////////////
#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的值