首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

为啥返回局部变量的引用不报错

2013-04-09 
为什么返回局部变量的引用不报错,/** File:main.cpp * Author: chujiangke * * Created on 2013年4月1日,

为什么返回局部变量的引用不报错,
/* 
 * File:   main.cpp
 * Author: chujiangke
 *
 * Created on 2013年4月1日, 下午11:04
 */

#include <cstdlib>
#include <iostream>
using namespace std;

/*
 * 
 */
class point
{
    int a;
    int b;
    //point(point&);
public:
    point(int b=0,int a=0){this->a=a;this->b=b;}
    int get_a(){return a;}
    int get_b(){return b;}
};
point& funciton1(point &a)
{
    point b;                  // 这不是局部变量吗,还有有没用给b分陪空间
                              // java里面point b这样写好像只是定义一个point b
                              // 要通过point b= new class point;分配具体的空间
                              //大家这么看 好困惑。
    b=a;                      //默认的拷贝构造函数
    return b;
    
}
int main(int argc, char** argv) {

    point a(11,12);
    point b=funciton1(a);
    cout<<b.get_a();
    return 0;
}
[解决办法]
point& funciton1(point &a)
{
    point b;                  // 这不是局部变量吗,还有有没用给b分陪空间
                              // java里面point b这样写好像只是定义一个point b
                              // 要通过point b= new class point;分配具体的空间
                              //大家这么看 好困惑。
    b=a;                      //默认的拷贝构造函数
    return b;
    
}
不会报错,会有警告,会告诉你使用一个无效对象,这个而对象b在该方法调用后,生命周期结束,你将返回一个无效的对象值。
[解决办法]
纠正一下:
b = a; 调用的不是拷贝构造函数,而是拷贝赋值操作符。

return b; 会调用缺省的拷贝构造函数。

一般而言缺省的拷贝构造函数都是浅拷贝。

没报错是运气问题,严格一点的编译器至少会给出警告。
[解决办法]
刚编译了下,有警告信息的,只是不注意发现不了

Compiling...


1.cpp
D:\Program Files\Microsoft Visual Studio\MyProjects\test1\1.cpp(19) : warning C4172: returning address of local variable or temporary
Linking...

test1.exe - 0 error(s), 0 warning(s)

热点排行