lightblueme

许多问题需要说清楚就可以&&走永远比跑来的重要

导航

理解-加号重载要使用全局函数+返回值非引用

一、C++中的加号重载使用全局函数的一个有点是可以使用级联的方式进行加法操作。

Fraction a,b,c,d,e;

A=b+c+d+e;

 若为成员函数

1、返回的bthis指针分别作用于后面的变量,因此是对b的修改;

2、如果返回一个新的变量,上面的级联的问题似乎可以解决。

3、问题在于如果存在隐式类型转换,且第一个参数为需要转化的类型时,可能找不到该定义的成员函数,因此使用全局的方式可以便面这个问题

二、返回值需要时一个值,而不是引用

从一个局部函数返回引用,可以考虑两种情况。

1、如果局部变量在栈上申请,那么在函数返回时,指针回退,这是当其他的函数再次执行时,可能就会将原来的值重写。这里的内存被重用,从而造成未知性。

下面是一个例子:

int& func()
{
    int m=9;
    return m;
}
void func2()
{
    int i=1;
    cout << "f2: " << i << endl;
}
int main(){
    int& fp=func();
    func2();
    cout<<fp<<endl;
    return 0;
}

Output is: 1

显然这造成内存的重写

有时我们写成这样

int main(){
    Int fp=func();
    func2();
    cout<<fp<<endl;
    return 0;
}

这是输出还是 9,原因是这是fp只是一个值,而不是引用

2、如果返回的值是在堆上申请的

   

Fraction a,b,c,d,e;

   A=b+c+d+e;

 那么我这里会造成内存泄露问题。

b+c返回了一个new的内存但是在执行(b+c)+d之后指针丢失,从而无法delete;后面的情况类似。

 

posted on 2015-05-09 22:09  lightblueme  阅读(310)  评论(0编辑  收藏  举报