首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

返回C++引用变量的做法是邪恶的吗?

在C++中,返回引用变量并不是邪恶的。然而,需要注意的是,返回局部变量的引用是不安全的,因为局部变量在函数返回后会被销毁,引用将指向无效的内存地址。为了避免这种情况,可以使用指针或者将引用的变量定义为静态变量或全局变量。

例如,以下代码将返回一个指向局部变量的指针:

代码语言:c++
复制
int* getInt() {
    int x = 10;
    return &x;
}

这段代码是不安全的,因为x是局部变量,当函数返回时,它将被销毁。因此,返回指向x的指针是不安全的。

相反,以下代码将返回一个指向静态变量的指针:

代码语言:c++
复制
int* getInt() {
    static int x = 10;
    return &x;
}

这段代码是安全的,因为x是静态变量,它的生命周期将持续整个程序的执行期间,因此返回指向x的指针是安全的。

总之,返回C++引用变量并不是邪恶的,但是需要注意局部变量的生命周期和作用域,以避免返回无效的引用。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

C++C++ 引用详解 ④ ( 函数返回 静态变量 全局变量 引用 指针 )

一、函数返回 静态变量 / 全局变量 引用 / 指针 1、函数返回局部变量引用或指针无意义 上一篇博客 【C++C++ 引用详解 ③ ( 函数返回值不能 “ 局部变量引用或指针 | 函数内...“ 局部变量引用或指针做函数返回值无意义 ) 得出如下结论 : 函数返回 “ 局部变量 引用 或 指针 时 , 无意义 ; 函数 执行完毕后 , 该 函数对应 栈内存 会被回收..., 相应 局部变量 地址 也有没有了意义 , 此时 , 再持有一个 函数返回 没有意义 引用 / 指针 , 取出随机无意义值 ; 2、函数返回静态变量/全局变量引用或指针 函数 返回..." 静态变量 " 或 " 全局变量 " 引用 / 指针 时 , 可以 ; 如果 函数 返回 静态变量 或 全局变量 引用 , 这两种变量 一旦分配内存后 , 在整个程序生命周期中...; 使用 引用 接收 fun2 函数返回引用 , 获取静态变量引用地址 , 该引用对应内存一直有效 , 因此可以通过该引用获取到内存中正确 静态变量值 ; 代码示例 : // 导入标准

23230

C++变量引用 | 使用变量引用

C++变量引用 C++可以对一个数据可以使用引用引用C++对C语言一个重要扩充,引用是一种新变量类型, 它作用是为一个变量起一个别名。...比如要给变量temp起个别名change: int temp;//定义整型变量temp int &change=temp;//声明changetemp引用 上述代码声明了changetemp引用...声明changetemp引用,可以理解为:使变量change具有变量temp地址。...在C++中,声明一个引用类型变量时,必须同时使之初始化,即声明它代表哪一个变量,在声明变量change变量temp引用后,在它们所在函数执行期间,该引用类型变量change始终与其代表变量temp...经典案例:C++使用变量引用

2.3K2219
  • C++C++ 引用详解 ③ ( 函数返回值不能 “ 局部变量引用或指针 | 函数内 “ 局部变量引用或指针做函数返回值无意义 )

    一、函数返回值不能 " 局部变量 " 引用或指针 1、引用通常做右值 之前使用 引用 时 , 都是作为 右值 使用 , 引用只在 声明 同时 进行初始化时 , 才作为左值 , // 定义变量 a...引用 , 如果 在 函数内部 栈内存 中创建 变量 地址 / 引用 , 那么 函数执行结束 , 返回时 , 该 栈内存直接被回收了 , 地址 / 引用 指向内存空间可能就是随机值 ;...如果 外部 main 函数中 变量 地址 / 引用 , 那么 肯定是从 参数中 传入 , 那么这个 地址 / 引用 就不需要返回 , 函数内部修改 , 直接体现在了外部变量中 ; 因此...如果 想要 在 函数中 , 返回 引用 / 指针 , 函数局部变量 引用 / 指针 返回不出来 , 即使强行返回 引用 / 指针 , 也是当前 局部变量 被 分配 栈内存 地址 , 该函数 执行完毕后..., 该 指针 局部变量 指针 ; 上述两个函数无意义 , 获取到 函数 返回 " 局部变量 " 引用 或 指针 , 然后获取地址 , 发现获取都是随机值 , 都是无意义值 ; num21

    48820

    论函数设计应如何才好,返回临时变量 | 返回引用 | 传递引用

    变量t,另外一次return 前,做一次拷贝构造 tempTest testTemp(){ tempTest t; return t; } 第一种,返回临时变量,这里的话,就会再发生一次...tempTest& testTemp2(){ tempTest * t = new tempTest(); return *t; } 第三种,然后,注意这里变量要用引用,这样,总得来说...一次最少了,但是如果返回引用的话,就得注意一个问题,内存泄露,所以不用得时候,要delete掉。返回指针同理。...void testTemp3(tempTest& t){ } 这样的话,只需要一次构造函数,然后,如果临时变量的话,超过使用范围,还会自动析构,更方便样子。...或者获得某个数据时候,用传引用会更好。

    2K21

    C++引用作函数参数 | 传送变量别名

    C++引用作函数参数 C++之所以增加引用类型,主要是把它作为函数参数,以扩充函数传递数据功能。  小林在之前推文中介绍过函数参数传递两种情况。...将变量名作为实参和形参,这时传给形参 变量值,传递单向。如果在执行函数期间形 参值发生变化,并不传回给实参。因为在调用函 数时,形参和实参不是同一个存储单元。 ...传递变量指针,形参指针变量,实参一个变量地址,调用函数时,形参指向 实参变量单元。...C++这种虚实结合方法仍然值传递方式,只是实参变量地址而已,C++提供了向函数传递数据第3种方法:传送变量别名。 经典案例:C++实现传送变量别名。...以上,如果你看了觉得对你有所帮助,就给小林点个赞叭,这样小林也有更新下去动力,跪谢各位父老乡亲啦~ C++引用作函数参数 | 传送变量别名 更多案例可以go公众号:C语言入门到精通

    1.5K88

    C++C++ 引用详解 ① ( 变量本质 - 引入 “ 引用 “ 概念 | 引用语法简介 | 引用做函数参数 | 复杂类型引用做函数参数 )

    一、变量本质 - 引入 " 引用 " 概念 " 引用 " 语法 C++ 语言中 特有的 , 在 C 语言中没有 引用 这个概念 ; 1、变量本质 - 内存别名 分析 引用 之前 , 先回顾下...下面讨论下 , 上述 变量 a 4 字节连续内存空间别名 , 那么 这段 4 字节内存空间 只能有一个内存别名 ?...别名 , 定义变量 时候 ; 第二次再为 该内存 赋予 别名 , 就是 获取该变量 " 引用 " ; 3、" 引用 " 优点 C++ 语言中 引用 特殊变量 , 通过引用可以访问已经存在变量...定义变量 a , 变量本质内存别名 int a = 10; // 定义引用 b , 变量 a 别名 int& b = a; // 通过引用修改变量值 b = 100; 引用C+...( C++ 语言中实现变量交换方法 ) 在下面的代码中 , 使用引用作为函数参数 , 也实现了变量交换 ; C++引用使用非常简单 , 没有使用指针进行操作 ; 在使用引用时 , 可以看到 引用效果

    97421

    C++核心准则-F.48 不要返回使用std:move从局部变量获得右值引用

    F.48: Don't return std::move(local) F.48 不要返回使用std:move从局部变量获得右值引用 Reason(原因) With guaranteed copy...目前,为了保证省略拷贝动作,在返回语句中显式使用std::move差不多是最差方式了。 译者注:copy elision称为拷贝省略或者译作“省略不必要拷贝”,很重要优化技术。...Example, bad(反面示例) S f() { S result; return std::move(result); } 译者注:使用std::move强制回避拷贝动作做法不被推荐...Example, good(良好示例) S f() { S result; return result; } 译者注:后一种写法利用了返回值优化(Return value optimization...,缩写为RVO)功能,它是C++一项编译优化技术。

    2.1K10

    作为程序员基本素养,你了解Python变量引用

    在我们编程当中,变量最最基础概念,它重要就相当于我们盖大楼用一块砖一样,不可或缺。所以,理解变量运行方式至关重要。 九层之台,始于垒土;合抱之木,始于毫末;千里之行,始于足下!...前台记录食用人数:引用计数 通信证号码:变量引用内存地址 实际上当我们对一个变量赋值时候,我们变量并没有存储这个值。...前台继续记录 hello,world:食用人数:1、123456:食用人数:1 在代码中,我们改变了a变量值,会发生什么呢? 我们再看看,改变a变量会发生什么? a = 123456 会这样?...其实这里很好理解,因为我们b赋值时候新建了一个对象。只要新建对象,就会重新开辟空间。 但是,像这样 b = c 这样并没有新建对象,而是将c引用传递给了b,他们都指向一个对象。...2, 3, 4] 总结: --- 可变对象:变量所指向内存地址处可以被改变 不可变对象:变量所指向内存地址处不可以被改变。

    48540

    返回类型引用(ref-qualified)C++成员函数暗示了什么?

    一、引子:返回引用类型成员函数 暗示了使用它this指针左值还是右值。反过来说,如果一个成员函数不返回引用类型,那么对this指针左值还是右值都是调用同一个函数。...那理解到这里?----二、解释:先说结论,来说一个c++一个理解。...如果成员函数有一致性(consistency),那么non-const, non-static函数 总是要被&( &-qualified)。...而另一种写法A{}.inc()被允许。这是consistency做法。...3.1、只对右值形参操作一种场景上面这个例子,防止用户错误地将一个暂存值传入给函数,然后期盼这个函数做出修改。(换句话说,只允许成员函数操作右值形参。

    20320

    C++变量存储类别 | 判断是否闰年

    C++静态存储方式 在上一节小林讲过,作用域从空间角度来分析,分为全局变量和局部变量,在这一节中,小林带着你学习变量另一种属性,变量在内存中存在期间,也就是存储期。 ...C++动态存储方式 动态存储区中存放以下数据: 函数形式参数,在调用函数时给形参分配存储空间。 函数中自动变量。 函数调用时现场保护和返回地址。...在C++中还有存储类别的属性,具体包含4种: 自动auto 静态static 寄存器registe 外部extern 根据变量存储类别,可以知道变量作用域和存储期。...endl;   }    return 0; //函数返回值为0  } 编译后结果: 请输入要判断年份:2008 2008闰年 --------------------------------...C++判断是否闰年 更多案例可以go公众号:C语言入门到精通

    8032828

    引用对象变量和对象间关系_白小白有女朋友

    直接操纵元素,还是用某种基于特殊语法间接表示(例如C/C++指针)来操作对象。所有这些在 Java 里都得到了简化,一切都被视为对象。因此,我们可采用一种统一语法。...上面的一段话说很清楚,“操纵标识符实际指向一个对象引用”,也就是说per一个引用指向一个可以指向Person类对象引用。...简单来说,对象引用意思“定义一个变量,这个变量指向一个对象“ Object obj=new Object(); //Object:类 //obj:对象引用 //new Object():对象...因此关于实例对象大体可以理解为对象引用意思… 4.何谓引用变量引用变量就是用引用类型声明变量,这种变量引用类型变量。...引用类型变量只是一个普通变量,储存了引用类型地址。对象创建直接在内存中分配一个内存。

    72620

    C++】函数 指针类型参数 与 引用类型参数 对比 ( 修改外部变量需要传入参数要求 | 参数作返回值 )

    讨论问题 : 本章只针对一点进行讨论 , 那就是对两种类型参数修改 , 是否影响到外部变量 ; 传入什么样参数才能修改外部变量 , 即 参数当返回值使用 ; 2 ....指针作为参数和返回值 ---- 指针作为参数和返回值 : 如果指针作为参数 , 修改 N 维指针指向地址 , 那么需要传入 N + 1 维指针 , 传入指向该 N 维指针 指针参数 ( N + 1...C 语言中参数 分类 : ① 普通变量参数 : C 语言中 普通变量 ( 非指针变量 ) 作为参数 , 只能进行值传递 , 不能通过参数返回结果 ; ② 指针变量参数 : C 语言中 , 如果要让函数参数可以将结果返回...C++引用参数 : C++ 在 C 语言基础上扩展了 引用 数据类型 , 使用引用可以替代上面的指针作为参数情况 , 使参数具有返回结果能力 ; 3 ....引用作为参数和返回值 ---- 引用作为参数和返回值 : 如果引用作为参数 , 修改 N 维指针指向地址 , 那么需要传入 N 维指针引用即可 ,在函数中修改该引用 , 即可修改外部引用变量

    2.2K20

    C++】 夜尽头不是 引用天空没有极限

    引用目录 在C++中呢,引用这一个概念可谓是非常重要,对后面C++学习有非常紧密关系,所以在接下来,我们会详细于大家分享  引用,揭开它神秘面纱,看看到底长什么样子!...int a=10; int&ra=a; int b=20; ra=b;//    这一步rab引用? 当然不是,引用只能引用一个实体,所以这里仅是简单赋值。...销毁后,n内存空间也销毁了吗? 还可以继续访问? 答案ok:n内存空间没有销毁,仍然可以访问!!...哈哈哈 所以,总结: 1.出了函数作用域,返回变量不存在了,不能用引用返回值,因为引用返回结果未定义 2.出了函数作用域,变量还在,可以用引用。...3.正确使用用引用返回值,可以减少拷贝,提高效率;还可以修改返回值。 返回数组中值,偶数数,一律乘二,很方便修改了返回值!

    27950

    java中局部变量和全局变量哪个优先_java中成员变量全局变量

    大家好,又见面了,我你们朋友全栈君。 Java变量 java中主要有如下几种类型变量: 一、局部变量 只在特定过程或函数中可以访问变量,被称为局部变量。...与局部变量相对应全局变量。 全局变量就是从定义位置起,作用域覆盖整个程序范围变量。 局部变量可以和全局变量重名,但是局部变量会屏蔽全局变量。...在函数内引用这个变量时,会用到同名局部变量,而不会用到全局变量。 一旦退出方法,构造函数或块中变量将被销毁。 访问修饰符不能用于局部变量。...(这是局部变量和实例变量一大区别) 二、全局变量(成员变量) 其中实例变量、类变量、常量都是属于成员变量,成员变量又被称为全局变量 java类成员变量有俩种:一种被static...//属于引用数据类型实例变量 static char ch = 'A'; //类变量(静态变量) final double constant= 12.6;

    1.2K20

    c++之类成员变量和类成员函数分开存储

    C++程序内存格局通常分为四个区: 全局数据区(data area),代码区(code area),栈区(stack area),堆区(heap area)(即自由存储区)。...全局数据区存放全局变量,静态数据和常量; 所有类成员函数和非成员函数代码存放在代码区; 为运行函数而分配局部变量、函数参数、返回数据、返回地址等存放在栈区;余下空间都被称为堆区。...根据这个解释,我们可以得知在类定义时,类成员函数被放在代码区,而类静态成员变量在类定义时就已经在全局数据区分配了内存,因而它是属于类。...对于非静态成员变量,我们在类实例化过程中(构造对象)才在栈区或者堆区为其分配内存,为每个对象生成一个拷贝,所以它是属于对象

    1.9K40

    你知道Python中4种变量作用域哪些

    B(Built-in) 内建作用域 变量/函数 查找顺序: L –> E –> G –>B 意思,在局部找不到,便去局部外局部作用域找(例如 闭包),再找不到就去全局作业域里找,再找不到就去内建作业域中找...在一个外函数中定义了一个内函数,内函数里运用了外函数临时变量,并且外函数返回内函数引用。这样就构成了一个闭包。其实装饰函数,很多都是闭包。...但是闭包一种特殊情况,如果外函数在结束时候发现有自己临时变量将来会在内部函数中用到,就把这个临时变量绑定给了内部函数,然后自己再结束。 你可以看下面这段代码,就构成了闭包。...在内函数里可以引用外函数变量。...关键字:global 将 局部变量 变为全局变量 关键字:nonlocal 可以在闭包函数中,引用并使用闭包外部函数变量(非全局噢) global好理解,这里只讲下nonlocal。

    2.1K10

    ​2021-03-06:go中,公共变量协程安全?赋值操作原子?为什么?

    2021-03-06:go中,公共变量协程安全?赋值操作原子?为什么? 福哥答案2021-03-06: 这是面试中被问到。实力有限,真正答案还不知道。...我想法a=1原子操作,a=b不是原子操作。实际开发中,不大可能a=1这种情况,可以说是协程不安全。...所以公共变量非协程安全,赋值操作是否原子跟变量类型及机器架构有关(指令集)。....github.io 16:28:09 今天每日一题我过最快一次 题078_ Tnze 10:27:04 公共变量不是协程安全,赋值操作不是原子 Tnze 10:27:45 这是由于线代多核...cpu中变量可能会储存在不同核心各自cache上 Tnze 10:29:05 需要原子操作一定要用sync包 题029_ 【新手】SQL双活负载均衡集群 7:48:53 2倍就是一个估计而已,2.5倍

    1.3K10

    C#7.0之ref locals and returns (局部变量引用返回,之前欠大家,现在补上)

    首先我们知道 ref关键字将值传递变为引用传递 那么我们先来看看ref locals(ref局部变量) 列子代码如下: static void Main(string[] args)...x赋给了x1,如果值类型传递,那么对x将毫无影响 还是输出3....接下来我们看看ref  returns (ref引用返回) 这个功能其实是非常有用,我们可以把值类型当作引用类型来进行return 老规矩,我们举个栗子,代码如下: 很简单逻辑..获取指定数组指定下标的值...ref返回引用类型,在重新赋值, arr数组中值,相应也改变了....总结一下:ref关键字很早就存在了,但是他只能用于参数,这次C#7.0让他不仅仅只能作为参数传递,还能作为本地变量返回值了 好了,就这么多. 谢谢大家捧场

    79590

    C++ 新特性学习(五) — 引用包装、元编程类型属性和计算函数对象返回类型

    ()操作符, 用于执行引用函数 同时与其配对函数有 std::ref 返回std::reference_wrapper,可以视为转换对象为引用 std::cref 返回常量引用对象std::reference_wrapper...,但是由于绑定变量和函数参数类型推断分离,会导致传值而不是引用 另外有些函数,如 std::ptr_fun, 通过函数指针构造函数对象 std::mem_fun, 通过成员函数指针构造函数对象 std...元编程类型属性 元编程定义可以修改自身或其他代码代码,当然,C++不是动态语言,这个修改可以在编译或执行时期。.../508.html) std::result_of::type 即是返回类型,比如: struct foo { double operator()(char, int); }; // 这两个一样...也许是我还没能把C++非常灵活吧,感觉后面的部分不太实用样子。 还需要继续努力啊

    1.3K30
    领券