重载+号的函数。返回值有关问题 求解
重载+号的函数。返回值问题 求解
到底重载+号的函数该怎么写呢?求解 分不多了。不好意思
#include <iostream.h>
class Date
{
private:
int day;
public:
Date()
{
day=0;
cout<<"object-new\n";
}
Date(int d)
{
day=d;
cout<<"object-new\n";
};
void PrintDay()
{
cout<<"day="<<day<<"\n";
}
~Date()
{
cout<<"object-over\n";
}
Date operator+(const Date &rd)
{
cout<<"enter func +"<<endl;
Date temp;
temp.day=day+rd.day;
cout<<"leave func +"<<endl;
return temp;
}
};
int main()
{
cout<<"enter main\n";
Date d1(1),d2(2);
d1+d2;
cout<<"end main\n";
return 1;
}
复制代码
重载了+号 这里 我返回的是一个对象 Date operator+(const Date &rd);
最后结果如下。
1:为什么多出来一个object-over呢?不是应该只有 d1,d2和temp三个对象么?,我测试。如果构造函数带new 析构函数带delete,这样就会崩溃
enter main
object-new
object-new
enter func +
object-new
leave func +
object-over
object-over
end main
object-over
object-over
Press any key to continue
如果我把重载的函数修改为返回对象的引用Date &operator+(const Date &rd);
这样就是三个object-new
和三个object-over
但是,返回局部对象的引用又是错误的。
到底重载+号该怎么写呢?求解
------解决方案--------------------
标准的 operator+ 应该实现为如下形式的非成员函数:
const Carrot operator+(const Carrot& lhs, const Carrot& rhs)
原因见: http://www.adintr.com/myarticle/operator.html
object-over 比 object-new 多一个是因为中间调用拷贝构造函数来生成了一个对象, 而你并没有是实现拷贝构造函数来输出 object-new, 所以是 object-new 少输出了一次.
------解决方案--------------------
temp 的作用域是只在函数里面, 但是是在你输出 leave func + 的语句之后.
返回的副本就是在堆栈里的, 虽然它的内存会等 main 结束后才释放, 但是它的构造函数在表达式结束时就调用了.
到底重载+号的函数该怎么写呢?求解 分不多了。不好意思
#include <iostream.h>
class Date
{
private:
int day;
public:
Date()
{
day=0;
cout<<"object-new\n";
}
Date(int d)
{
day=d;
cout<<"object-new\n";
};
void PrintDay()
{
cout<<"day="<<day<<"\n";
}
~Date()
{
cout<<"object-over\n";
}
Date operator+(const Date &rd)
{
cout<<"enter func +"<<endl;
Date temp;
temp.day=day+rd.day;
cout<<"leave func +"<<endl;
return temp;
}
};
int main()
{
cout<<"enter main\n";
Date d1(1),d2(2);
d1+d2;
cout<<"end main\n";
return 1;
}
复制代码
重载了+号 这里 我返回的是一个对象 Date operator+(const Date &rd);
最后结果如下。
1:为什么多出来一个object-over呢?不是应该只有 d1,d2和temp三个对象么?,我测试。如果构造函数带new 析构函数带delete,这样就会崩溃
enter main
object-new
object-new
enter func +
object-new
leave func +
object-over
object-over
end main
object-over
object-over
Press any key to continue
如果我把重载的函数修改为返回对象的引用Date &operator+(const Date &rd);
这样就是三个object-new
和三个object-over
但是,返回局部对象的引用又是错误的。
到底重载+号该怎么写呢?求解
------解决方案--------------------
标准的 operator+ 应该实现为如下形式的非成员函数:
const Carrot operator+(const Carrot& lhs, const Carrot& rhs)
原因见: http://www.adintr.com/myarticle/operator.html
object-over 比 object-new 多一个是因为中间调用拷贝构造函数来生成了一个对象, 而你并没有是实现拷贝构造函数来输出 object-new, 所以是 object-new 少输出了一次.
------解决方案--------------------
temp 的作用域是只在函数里面, 但是是在你输出 leave func + 的语句之后.
返回的副本就是在堆栈里的, 虽然它的内存会等 main 结束后才释放, 但是它的构造函数在表达式结束时就调用了.