类引用作为函数返回值的问题

记录自己尝试C++的一点心得

我的第一个尝试其实是如下,

class Object{
public:
 static int r(){
    int i=1;
    return i;
  }
};

int main(int argc, char const *argv[]) {
  int& i=Object::r();
   return 0;
}

报错信息

main.cpp:40:19: error: invalid initialization of non-const reference of type ‘int&’ from an rvalue of type ‘int’

在编译的时候就出现问题。引用是变量的别名,而函数返回值在main里是不能改变的,所以需要常引用,const int&才形

然后又试了下如下

class Object{
public:
    static Object&  new_instance(){
    //只能使用非引用的方式将局部对象变量传出去
    Object o;
    return o;
  }
  static int & f(){
    //这里也有上述问题
    int i=1;
    return i;
  }
}
int main(int argc, char const *argv[]) {
  const int& i=Object::f();
   const Object & o=Object::new_instance();
  printf("%d\n",i );
  printf("%d\n",o.i);
}

编译时警告

main.cpp: In static member function ‘static Object& Object::new_instance()’:
main.cpp:17:12: warning: reference to local variable ‘o’ returned [-Wreturn-local-addr]
     Object o;
            ^
main.cpp: In static member function ‘static int& Object::f()’:
main.cpp:22:9: warning: reference to local variable ‘i’ returned [-Wreturn-local-addr]
     int i=1;

运行是会出现段错误,函数内的局部变量是不能作为引用的返回值的。

时间: 2024-11-14 12:59:14

类引用作为函数返回值的问题的相关文章

将引用作为函数返回值的优缺点

格式:类型标识符 &函数名(形参列表及类型说明){ //函数体 }好处:在内存中不产生被返回值的副本:(注意:正是因为这点原因,所以返回一个局部变量的引用是不可取的.因为随着该局部变量生存期的结束,相应的引用也会失效,产生runtime error!注意事项:(1)不能返回局部变量的引用.这条可以参照Effective C++[1]的Item 31.主要原因是局部变量会在函数返回后被销毁,因此被返回的引用就成为了"无所指"的引用,程序会进入未知状态.(2)不能返回函数内部new

C++ Primer 学习笔记_17_从C到C++(3)--引用、const引用、引用传递、引用作为函数返回值、引用与指针区别

欢迎大家阅读参考,如有错误或疑问请留言纠正,谢谢 一.引用 1.引用是给一个变量起别名 变量: 名称 空间 引用: 引用不是变量 引用仅仅是变量的别名 引用没有自己独立的空间 引用要与它所引用的变量共享空间 对引用所做的改变实际上是对它所引用的变量的改变 引用在定义的时候必须要进行初始化 引用一经初始化,不能重新指向其他变量 2.定义引用的一般格式: (1)类型  &引用名 = 变量名: (2)例如: int a=1; int &b=a; // b是a的别名,因此a和b是同一个单元 (3)

引用作为函数返回值的一点思考

本篇文章的关注点是引用作为函数返回值,网上类似很多,具体可参考引用作为函数返回值的优缺点.这里,我想写下自己的想法. 在C++中,引用变量必须要初始化,否则会有编译错误.这里指的初始化,一般变量赋值初始化.如果是通过函数返回值来初始化,那就要好好考虑下. 以获取字体信息场景为例子:在启动时,通过读取字体配置文件来获得字体信息,保存在m_vLogFont.外部通过GetFont接口函数来获得字体信息,每一个Id对于一种字体,接口函数大致实现如下: const LOGFONT& GetFont(in

转: 引用作为函数返回值

转自:http://blog.csdn.net/vivi_wang_11/article/details/7437382 函数返回值时,要生成一个值的副本.而用引用返回值时,不生成值的副本. 例如,下面的程序是有关引用返回的4种形式: //********************* //** ch9_6.cpp ** //********************* #include <iostream.h> float temp; float fn1(float r) { temp = r*r

将引用作为函数返回值的格式、好处和规则

格式: 类型标识符 &函数名(形参列表及类型说明){//函数体} 好处: 在内存中不产生返回值的副本(返回一个局部变量的引用是不可取的,因为随着局部变量生存周期的结束,相应的引用也会失效,产生runtime error) 注意: 不能返回局部变量的引用,局部变量会在函数返回后被销毁. 不能返回函数内部new分配的内存的引用,虽然不存在局部变量的被动销毁问题,但是函数返回的引用只是作为一个临时变量出现,并没有被赋予一个实际的变量,导致引用所指向的空间无法释放. 可以返回类成员的引用,但最好是con

string类find函数返回值判定

 string类find函数返回值判定 代码示例 #include<iostream> #include<cstring> using namespace std; int main() { static const size_t npos = -1; string s = "Alice Bob Charlie"; size_t position; position = s.find("none"); //position = s.find(

C++基础知识(八)---函数返回值(返回值,返回指针,返回对象,返回引用)---引用---复制构造函数(拷贝构造函数)

一.函数返回值 1.返回值: int test () { int a=1; return a; } 返回值时最简单的方式,它的操作主要在栈上,变量a在函数结束后会删除,为了返回a的值,系统会在内部建立一个临时变量保存a的值,以返回给调用该函数的表达式,调用结束后变量便不再存在.如果a是简单地数据类型也无所谓,不是很占用内存,如果a是大的自定义类型的数据,那么对a的复制将会占用比较大的内存.函数返回值是右值,不能进行运算符操作. 2.返回指针: int *test2() { int *b=new

const修饰函数参数 const修饰函数返回值 const修饰成员函数

看到const 关键字,C++程序员首先想到的可能是const 常量.这可不是良好的条件反射.如果只知道用const 定义常量,那么相当于把火药仅用于制作鞭炮.const 更大的魅力是它可以修饰函数的参数.返回值,甚至函数的定义体. const 是constant 的缩写,"恒定不变"的意思.被const 修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性.所以很多C++程序设计书籍建议:"Use const whenever you need". 1

const 小结: 做函数参数,做函数返回值,以及const函数

做函数参数 : 例如 fun(const int * i)参数i的值不能在fun()函数执行的过程中被修改,它将一直保持调用此函数时传入的值.如果试图修改i值的语句在fun()函数中出现,将导致程序无法编译,这样对参数i起到保护作用. 注:const 通常用来限制函数的指针参数,引用和数组参数,而一般形式的参数因为形参和实参本不是同一内存单元的变量,所以对形参的修改不会影响实参,因此也没有必要限制函数体不能对参数进行修改.  做函数返回值 : 函数返回值为 const 只有用在函数返回为引用的情