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

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

一、函数返回值不能是 " 局部变量 " 的引用或指针 1、引用通常做右值 之前使用 引用 时 , 都是作为 右值 使用 , 引用只在 声明 的 同时 进行初始化时 , 才作为左值 , // 定义变量 a..., 返回 局部变量 的 地址 / 引用 是无意义的 , 一般 函数 只 返回一个 int 值 , 表示 该函数 是否执行成功 , 如果执行失败 , 返回错误码 ( 在哪一步执行失败 ) ; ----...如果 想要 在 函数中 , 返回 引用 / 指针 , 函数局部变量的 引用 / 指针 是返回不出来的 , 即使强行返回 引用 / 指针 , 也是当前 局部变量 被 分配的 栈内存 地址 , 该函数 执行完毕后..." 引用或指针做函数返回值测试 ---- 下面的 int& getNum2() 函数 , 返回一个引用 , 该 引用 是 局部变量 的引用 ; 下面的 int* getNum3() 函数 , 返回一个指针..., 该 指针 是 局部变量 的指针 ; 上述两个函数是无意义的 , 获取到 函数 返回的 " 局部变量 " 的 引用 或 指针 , 然后获取地址 , 发现获取的都是随机值 , 都是无意义的值 ; num21

60620

.map(parseInt)的返回值是什么?你真的了解基数radix吗

['1', '2', '3'].map(parseInt) 的返回值是什么?很多人的第一反应是 [1, 2, 3] ,但是结果并非如此。...我们慢慢往下看: map 方法: MDN 给出的解释是:map() 方法创建一个新数组,其结果是该数组中的每个元素是调用一次提供的函数后的返回值。...index(可选):callback 数组中正在处理的当前元素的索引。 array(可选):map 方法调用的数组。...语法: parseInt(string, radix); parseInt() 可以接受两个参数: string 要被解析的值。...看到这,应该可以理解 radix 的含义了吧,并不是简单的进制计算。 未经允许不得转载:w3h5 » ['1','2','3'].map(parseInt)的返回值是什么?你真的了解基数radix吗

78320
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    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.2K10

    C++ 程序员的 Java 指南

    boolean 值只能是 true 和 false,不能从整形等其它值转换而来。用于字符串连接的时候会自动转换成「true」和「false」。...if 里只能接受 boolean 值,所以 C++ 里的好习惯 if (5 == var) 在 Java 里不再必要,少写了一个 = 的时候 IDE 和编译器都会提示你。...java 中的 abstract 方法不能有方法体,c++ 中的 pure virtual 函数可以有实现。...从内部类里引用外部类的属性或者方法时,可以用命 OuterClass.this.。 非静态内部类里不能有静态成员。 内部类可以使用 static 修饰,外部类不行。...HashSet 判断两个元素相等的标准是两个对象通过 equals 方法比较相等,并且两个对象的 hashCode() 方法返回值也相等。

    60910

    C++ 程序员的 Java 指南

    boolean 值只能是 true 和 false,不能从整形等其它值转换而来。用于字符串连接的时候会自动转换成「true」和「false」。...if 里只能接受 boolean 值,所以 C++ 里的好习惯 if (5 == var) 在 Java 里不再必要,少写了一个 = 的时候 IDE 和编译器都会提示你。...当系统加载类或创建该类的实例时,系统自动为成员变量分配内存空间,并在分配内存空间后,自动为成员变量指定初始值。 局部变量定义后,必须经过显式初始化后才能使用,系统不会为局部变量执行初始化。...从内部类里引用外部类的属性或者方法时,可以用命 OuterClass.this.。 非静态内部类里不能有静态成员。 内部类可以使用 static 修饰,外部类不行。...HashSet 判断两个元素相等的标准是两个对象通过 equals 方法比较相等,并且两个对象的 hashCode() 方法返回值也相等。

    44830

    你真的了解 Java 8 中的 lambda 表达式、方法引用、函数式接口、默认方式、静态方法吗

    ; 4 }).start(); 你会发现,用 lambda 表达式的方式能够写更少的代码,看起来也会更加的舒服和简洁。 这里没有使用参数,只是一个简单的例子。 我们再看一个例子。...1s -> s.length() 在第二个测试中,我们使用的是静态方法引用来获取每个字符串的长度。 1String::length 在第三个测试中,我们使用的是实例方法引用。...总结 ① 使用方法 1类名::方法名 ② 方法可以是:静态方法,实例方法 构造函数引用 在上面我们讲了方法引用的基本使用方法,其实除了方法引用以外,还有构造函数引用,回想一下,以前我们创建对象是怎么做...接口 在 Java 8 之前的接口是不能有实现的,只能定义抽象方法,然而,在 Java 8 以后,增加了一个新的功能,可以添加实现,可以定义默认方法,可以定义静态方法。...并且实现了方法。 静态方法 默认方法很简单,用 static 声明即可。

    1.2K20

    一点一滴探究JVM之内存结构

    [] args) { f(); } } 这个简单的递归,不对,它不算是递归,因为没有终止条件,但是你知道它最终会报什么错误,知道为什么会报这个错误吗?...其实: 每个方法执行的时候都会创建一个栈帧(Stack Frame)的东西,学过c/c++的应该都对这个概念熟悉。栈帧用于存储局部变量表、操作数栈、动态链接、方法出口信息等。...无论采用何种退出方式,在方法退出之后,都需要返回到方法被调用的位置,程序才能继续执行。方法返回时可能需要在栈帧中保存一些信息,用来帮助恢复它的上层方法的执行状态。...一般来说,方法正常退出时,调用者的PC计数器的值就可以作为返回地址,栈帧中很可能保存了这个计数器值,而方法异常退出时,返回地址是要通过异常处理器来确定的,栈帧中一般不会保存这部分信息。...方法退出的过程实际上等同于把当前栈帧出站,因此退出时可能执行的操作有:恢复上层方法的局部变量表和操作数栈,如果有返回值,则把它压入调用者栈帧的操作数栈中,调整PC计数器的值以指向方法调用指令后面的一条指令

    1.4K00

    C++基础系列の函数

    如果你没有看过那篇文章,可以点击右边的链接前往:C++の函数 返回值 上一篇文章我们主要说了函数的参数列表,那么函数除了有参数列表外,还有另一个要素,返回值。...如果有返回值的话,又返回我们想要返回的数据,如果没有的话就用void。这个跟C中一样,没什么需要强调的,那么有的的朋友可能会想到我们之前介绍过引用和指针了,它们可以作为函数的返回值吗?...这里需要做个区分,如果引用或者指针在函数体外,也就是说不是这个函数的局部变量的话,它们是可以作为返回值的,但是如果引用或指针是在这个函数中定义的话,也就是局部变量的话,就不能作为函数的返回值。...原因很简单,因为函数作为最小的执行单元,在执行完后会被释放掉,函数中所有申请的非静态资源均要被释放,如果这个引用或指针作为返回值的话,是不能将值传出来的。...函数重载 如果朋友们有面向对象编程经验的话,那么一定听说过函数重载这个概念,这个在java中叫方法重载,其实本质上是一样的。

    28320

    C++笔试面试题整理

    例如,你不能用static_cast象用C风格的类型转换一样把struct转换成int类型或者把double类型转换成指针类型,另外,static_cast不能从表达式中去除const属性,因为另一个新的类型转换操作符...const修饰函数的返回值:如果给“指针传递”的函数返回值加const,则返回值不能被直接修改,且该返回值只能被赋值给const修饰的同类型指针。...格式:类型标识符 &函数名(形参列表及类型说明){ //函数体 } 好处:在内存中不产生被返回值的副本;(注意:正是因为这点原因,所以返回一个局部变量的引用是不可取的。...因为随着该局部变量生存期的结束,相应的引用也会失效,产生runtime error! 注意事项: (1)不能返回局部变量的引用。这条可以参照Effective C++[1]的Item 31。...函数重载是一个同名函数完成不同的功能,编译系统在编译阶段通过函数参数个数、参数类型不同,函数的返回值来区分该调用哪一个函数,即实现的是静态的多态性。但是记住:不能仅仅通过函数返回值不同来实现函数重载。

    2.6K40

    从 Java 到 Kotlin,再从 Kotlin 回归 Java

    意味着具有未定义空值的T类型。这种奇怪的类型不能用Kotlin来表示,它只能从Java类型推断出来。T!会误导你,因为它放松了对空的限制,并禁用了Kotlin的空值安全限制。...如果你让Kotlin做了令人难以置信的局部变量类型推断呢? ? 坏主意。这个Kotlin的代码看起来很安全,也可以编译通过,但是允许空值在你的代码中不受约束的游走,就像在Java中一样。...不过我知道这会加大使用Kotlin的难度。 第二个问题。在阅读一个方法声明的时候,你最先想知道的应该是方法的名称和返回类型,然后才会去了解参数。...在 Kotlin 中,方法的返回类型远在行末,所以可能需要滚动屏幕来阅读: ? 另一种情况,如果参数是按分行的格式写出来的,你还得去寻找返回类型。...这是想回归 C++ 语法吗?对于我来说,这让人感到困惑。 这里最具争议的话题是默认封闭。可能是因为 Java 程序员过度使用了继承,可能你应该在允许类被继承之前想想清楚。

    1.8K40

    c++的lambda使用注意事项,可能导致的崩溃问题分析

    示例三,lambda引用了局部变量divisor, 但是局部变量的生命期在addDivisorFilter返回时终止,也就是在filters.emplace_back返回之后,所以添加到容器的函数本质上就像是一到达容器就死亡了...若需要用到的外部局部变量,需以值传递的方式捕获而非引用捕获(若是外部指针变量则需深拷贝)。 2、谨慎使用或者不用外部指针。...如果你用值捕获了个指针,你在lambda创建的闭包中持有这个指针的拷贝,但你不能阻止lambda外面的代码删除指针指向的内容,从而导致你拷贝的指针空悬。...3、注意引用捕获陷阱:引用捕获[&]不要使用外部局部变量。 4、注意this陷阱:lambda里避免有全局变量或静态变量或者比当前类生命周期更长的变量。...默认值捕获就意外地捕获了this指针,而不是你以为的外部变量。

    4.2K10

    【C++篇】C++类与对象深度解析(四):初始化列表、类型转换和static成员讲解

    C++类与对象超详细入门指南 前言 欢迎讨论:如果你在学习过程中有任何问题或想法,欢迎在评论区留言,我们一起交流学习。你的支持是我继续创作的动力! 点赞、收藏与分享:觉得这篇文章对你有帮助吗?...别忘了点赞、收藏并分享给更多的小伙伴哦!你们的支持是我不断进步的动力! 分享给更多人:如果你觉得这篇文章对你有帮助,欢迎分享给更多对C++感兴趣的朋友,让我们一起进步! 1....这种优化被称为返回值优化(RVO)或拷贝省略。 2.6 类型转换总结 C++中的类型转换是一个强大且灵活的机制,通过构造函数,我们可以轻松地在内置类型和类类型之间进行隐式或显式的转换。...通过静态成员,我们可以方便地实现对象计数、全局状态管理等功能,这让类在不依赖对象实例的情况下,依然能够提供有用的功能。 相信通过这篇文章你对C++类与对象高级部分的有了初步的了解。...如果此篇文章对你学习C++有帮助,期待你的三连,你的支持就是我创作的动力!!!

    7000

    你说你是高工,匿名内部类有我玩得6吗?

    匿名内部类,顾名思义就是不知道名字的内部类。它真的就没有名字吗?有想过这个问题吗?如果你想过,那证明你是一个不甘于做初级工程师,想往上拔高的人。...其实也是不可以的,那有同学就讲了,你在这瞎折腾了半天,都是不可以那还讲干啥?聪明的同学可能能从上面也能吸取到一些知识。比如,你可以去查一下哪些语言支持第一种方式,这里只是给你抛砖引玉用的。...如果我们将匿名内部类放在静态的方法中,那么编译器就不会将任何外部类的实例作为构造方法的参数传入了。 还有一个我们在匿名内部类访问局部变量时,需要将局部变量声明为final的。原因是什么呢?...因为如果你在匿名内部类访问局部变量的时候,编译器一样会在匿名内部类的构造方法中将其作为参数传进去,不过呢,传进去的时候是当时的一个拷贝,如果不是final的,那么你的代码在后面对变量进行更改的话,那么在匿名内部类中使用的还是旧的值...所以,综上我们知道匿名内部类的构造方法的定义是: 由编译器定义 构造方法的参数 外部类的对象(定义在非静态方法区) 父类的外部类的对象(父类是非静态的) 父类的构造方法参数 外部捕获的变量(方法体引用的局部

    53610

    Java虚拟机工作原理详解

    Resolving:将该类常量池中的符号引用都改变为直接引用。(不是很理解) Initialing:初始化类的局部变量,为静态域赋值,同时执行静态初始化块。...从这一块内存中分出一块用来存储一些运行数据,例如创建的对象,传递给方法的参数,局部变量,返回值等等。分出来的这一块就称为运行数据区域。...取值的时候,取出的是2这个索引中的值。如果是静态方法,则数组第0个不存放this引用,而是直接存储传递的参数。...》栈帧中数据引用: 除了局部变量数组和操作数栈之外,栈帧还需要一个常量池的引用。当JVM执行到需要常量池的数据时,就是通过这个引用来访问常量池的。栈帧中的数据还要负责处理方法的返回和异常。...如果通过return返回,则将该方法的栈帧从Java栈中弹出。如果方法有返回值,则将返回值压入到调用该方法的方法的操作数栈中。另外,数据区中还保存中该方法可能的异常表的引用。

    47310

    蒋豆芽面试题专栏总结(C++软件开发与嵌入式软件)完成了!

    指针函数与函数指针的区别 (1)定义不同指针函数本质是一个函数,其返回值为指针。 函数指针本质是一个指针,其指向一个函数。...栈由操作系统自动分配释放 ,存放函数的参数值,局部变量的值等,栈有着很高的效率;堆一般由程序员分配释放,堆的效率比栈要低的多。 堆栈缓存方式不同。...⭐⭐⭐⭐⭐ 1.19 初始化为0的全局变量在bss还是data⭐⭐⭐⭐ 蒋豆芽的秋招打怪之旅——C++说爱你不容易 1.1 你怎么理解C语言和C++的区别?...⭐⭐⭐⭐⭐ 1.2 简述下C++语言的特点⭐⭐⭐⭐ 1.3 简述C++从代码到可执行二进制文件的过程⭐⭐⭐⭐⭐ 1.4 说说include头文件的顺序以及双引号""和尖括号的区别⭐⭐⭐ 1.5 知道动态链接与静态链接吗...⭐⭐⭐⭐⭐ 1.18 说说静态局部变量,全局变量,局部变量的特点,以及使用场景⭐⭐⭐⭐ 1.19 说说静态变量什么时候初始化?

    2.1K41

    CC++面试题之语言基础篇(一)

    准备C/C++面试需要深入研究语言基础知识,掌握控制流结构、函数、指针和标准库,同时准备好回答各种与C/C++编程相关的问题,这将有助于你在面试中脱颖而出。...C和C++都有结构的概念,但是在C语言中结构只有成员变量没有成员方法,而在C++结构中,它可以有自己的成员变量以及成员方法。...对于C++:全局或静态对象对象首次用到时才进行构造。 静态局部变量,全局变量,局部变量的特点 首先从作用域考虑: 全局变量:全局作用域,可以通过extern作用于其他非定义的源文件。...静态全局变量 :全局作用域+文件作用域,所以无法在其他文件中使用。 局部变量:局部作用域,比如函数的参数,函数内的局部变量等等。 静态局部变量 :局部作用域,只被初始化一次,直到程序结束。...生命周期: 局部变量在栈上,出了作用域就回收内存;而全局变量、静态全局变量、静态局部变量都在静态存储区,直到程序结束才会回收内存。

    30910

    java与c++内存泄露的问题

    ,GC Roots 一般包含,静态变量引用的对象,虚拟机栈中引用的对象,本地方法栈中引用的对象和方法区中的常量对象(就是有final修饰的对象)。        ...,如果说你这个方法运行的时间很短,那么当你方法调用完方法的时候这个对象自然变成了可回收的对象。...,而栈帧包含有局部变量表,操作数栈,返回地址以及动态链接,那么方法的参数,与方法中的局部变量就存放在局部变量表的当中(实例的引用由一个slot槽存放),上面不是说到,GC Roots包含有虚拟机栈中引用的对象吗...这是你方法运行的时间较短的时候,这样很明显不存在内存泄露的问题,但是当你的方法运行的时间很长的话,那么你的实例就不会得到回收,这就出现了内存泄露的问题,所以你用完对象后就必须把你的引用设置成null。...,为什么会说可能会出现内存泄露呢,是因为jvm的某种机制,就可能不会出现内存泄露,上面不是说,局部变量都是存放在局部变量表中吗,局部变量就存储在slot槽当中的,当你对象超出了作用域之后,slot槽中的引用并不会消失

    72510
    领券