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

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

一、函数返回值不能是 " 局部变量 " 的引用指针 1、引用通常做右值 之前使用 引用 时 , 都是作为 右值 使用 , 引用 声明 的 同时 进行初始化时 , 才作为左值 , // 定义变量 a...引用 和 指针 作为 传入的 参数 ; main 函数 , 调用 函数 , 创建一个 变量 , 将 变量 的 地址 / 引用 传入 函数 , 函数通过 指针符号 或者 引用 , 直接修改传入的实参..., 也就是 修改 地址 / 引用 指向的 内存的数据 , 该操作可以修改 外部 main 函数变量值 ; 如果 想要 函数 , 返回一个 地址 / 引用 作为返回值 , 这个 地址 /..., 返回 局部变量 的 地址 / 引用 是无意义的 , 一般 函数 只 返回一个 int 值 , 表示 该函数 是否执行成功 , 如果执行失败 , 返回错误码 ( 在哪一步执行失败 ) ; ----...如果 想要 函数 , 返回 引用 / 指针 , 函数局部变量引用 / 指针 是返回不出来的 , 即使强行返回 引用 / 指针 , 也是当前 局部变量 被 分配的 栈内存 地址 , 该函数 执行完毕后

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

C++核心准则编译边学-F.43 永远不要返回指向局部对象的指针引用

F.43: Never (directly or indirectly) return a pointer or a reference to a local object 无论直接还是间接,永远不要返回指向局部对象的指针引用...这段代码我设法读取函数f被调用后放弃的局部变量。保存在glob的指针可以很长时间之后被使用并以无法预期的方式带来麻烦。...局部变量的地址以多种方式被“返回”或者说被泄漏。具体的方式可以通过返回语句,T&类型的输出参数,返回对象的成员,返回值数组的元素或者是其它方式。...它可以通过类似的技术检查防止。 译者注:指针无效化应该是指针本来指向的是一个有效对象,但后来对象被销毁而指针没有被同时清空的情况。...编译器倾向于捕捉返回指向局部变量引用的情况,也可以很多情况下捕捉返回指向局部变量的指针的情况。

68720

C++C++的 this 指针用法 ③ ( 全局函数 与 成员函数 相互转化 | 有参构造函数设置默认参数值 | 返回匿名对象返回引用 )

, 就是通过 this 指针隐藏左操作数 , 对象本身 就是 左操作数 , 成员函数 , 通过 this 指针访问对象本身的成员 ; 全局函数 , 实现两个 Student 类相加 , 接收两个...设置一个默认值 , 此时就可以使用 类名 对象名 的方式定义对象变量 ; class Student { public: // 带参构造函数 Student(int age = 0, int height..., 创建 Student 对象 ; 三、返回匿名对象返回引用 ---- 在上面的章节 , 将 两个 Student 对象相加 , 返回的是一个匿名对象 , 该匿名对象 成员函数 中新创建的对象...age = this->age + s2.age; this->height = this->height + s2.height; // 注意 : 返回的是一个引用 , 就是返回自身对象变量...age; this->height = this->height + s2.height; // 注意 : 返回的是一个引用 , 就是返回自身对象变量 // this 是指针 , *this

16320

C++ 面试必备:常见 C++ 面试题汇总及详细解析

指针是C++的一种数据类型,指针变量存储了一个内存地址,该地址指向某个变量或者对象。指针可以用来访问和修改内存的数据,同时也可以通过指针来传递参数和返回值。...引用也是C++的一种数据类型,它提供了一种简洁而高效的方式来操作变量对象,而不需要拷贝它们本身。引用被视为原变量的一个别名,其操作类似于指针,但是引用不能被赋值为NULL,也不能进行指针运算。...C++基类的析构函数声明为虚函数是为了确保通过基类的指针引用删除派生类对象时,可以正确地释放派生类对象所占用的内存。...C++,extern关键字用于声明一个已经在别处定义的变量、函数类的引用,从而允许一个文件中使用在其他文件定义的全局变量、函数类。...比如,如果在一个.cpp文件定义了一个全局变量int globalVar = 10;,那么另一个.cpp文件可以通过使用extern int globalVar;来引用这个全局变量,从而可以使用它的值

1.8K30

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

C和C++都有结构的概念,但是C语言中结构只有成员变量没有成员方法,而在C++结构,它可以有自己的成员变量以及成员方法。...关键字:C++,导入C函数的关键字是extern,表达形式为extern “C” extern是C/C++语言中的一个关键字,用于声明一个变量函数具有外部链接性,即这些变量函数可以被其他文件访问...对于C++:全局静态对象对象首次用到时才进行构造。 静态局部变量,全局变量,局部变量的特点 首先从作用域考虑: 全局变量:全局作用域,可以通过extern作用于其他非定义的源文件。...结构体的比较,怎么判断两个对象是否相等 需要逐个比较它们的成员变量(字段) 继承关系的子类能访问父类哪些成员变量以及成员函数 继承关系,子类(派生类)通常可以访问父类(基类)的以下成员变量和成员函数...c++A类访问B类的私有成员的解决方法 使用友元函数友元类:B类声明A类为友元,或者A类声明B类为友元 提供公有成员函数接口:如果希望B类的私有成员被A类间接访问,可以B类中提供一些公有成员函数接口

16310

C++补充知识&C++11及其特性

右值(rvalue)——通过排他性来定义,每个表达式不是左值就是右值,rvalue是不在内存占有确定位置的表达式,而是存在寄存器。 所有的左值(无论是数组,函数不完全类型)都可以转化成右值。...函数返回值当引用 C++使用引用时的难点 当函数返回值为引用时 若返回变量,不能称为其他引用的初始值,不能作为左值使用。...(变量和其对应的地址对不上了,该变量指向的那个地址所存的内容被覆盖了)-个人理解) 若返回静态变量全局变量 可以成为其他引用的初始值。 即可作为右值使用,也可以作为左值使用。...返回形参当引用 (注:C++链式编程,经常用到引用, 例如运输符重载) Array容器 详见-C++SLT容器。...因C++编译器在编译检查一般都能通过;C语言中不能隐式类型转换的,c++可以用 reinterpret_cast() 进行强制类型解释**。

37410

c++ thread探坑

所以joinable()为true的thread变量离开作用域之前,可以通过调用join()detach()来使joinable()为false,也可以通过移动来转移所有权。...访问局部变量引用就能通过传参了,这种情况可以是传入可调用的对象,而对象的成员存在对局部变量引用。...thread变量时,会首先将函数(或可调用对象)和参数通过复制移动的方式(取决于传入的是左值还是右值)创建对应的副本,这个过程是本地线程完成。...之后对函数(或可调用对象)副本和参数副本以右值引用的参数形式创建副本的副本。最后新线程以最终函数(或可调用对象)的副本调用最终参数的副本。...如果一定要在新线程修改原始变量的话,则可以通过std::ref()。

1.1K100

C++笔试面试题整理

这就是说,你能用dynamic_cast把指向基类的指针引用转换成指向其派生类其兄弟类的指针引用,而且你能知道转换是否成功。...因为随着该局部变量生存期的结束,相应的引用也会失效,产生runtime error! 注意事项: (1)不能返回局部变量引用。这条可以参照Effective C++[1]的Item 31。...(3)可以返回类成员的引用,但最好是const。这条原则可以参照Effective C++[1]的Item 30。...如果其它对象可以获得该属性的非常量引用指针),那么对该属性的单纯赋值就会破坏业务规则的完整性。...答:多态是指相同的操作函数、过程可作用于多种类型的对象上并获得不同的结果。不同的对象,收到同一消息可以产生不同的结果,这种现象称为多态。 请用简单的语言告诉我C++是什么?

2.5K30

c++】类型转换

显式类型转换将所有情况混合在一起,代码不够清晰 因此C++提出了自己的类型转化风格,注意因为C++要兼容C语言,所以C++可以使用C语言的转化风格。...const属性,转化后就可以对const变量进行修改了:比如下面的a不可以被修改,现在通过const_cast转化成int* int main() { const int a = 2; int* p...a地址的const属性,这时候就可以通过使用指针来修改a的值了。...如果父类的指针(引用)指向的是一个子类对象,那么将其转换为子类的指针(引用)则是安全的,没有问题 使用C强制类型转换向下转型是不安全的,因为此时无论父类的指针(引用)指向的是父类对象还是子类对象都会进行转换...使用dynamic_cast向下转型是安全的,如果父类的指针(引用)指向的是子类对象那么dynamic_cast会转换成功,但如果父类的指针(引用)指向的是父类对象那么dynamic_cast会转换失败并返回一个空指针

18920

CC++常见面试知识点总结附面试真题—-20220326更新

C程序的设计首要考虑的是如何通过一个过程,对输入(环境条件)进行运算处理得到输出(实现过程(事务)控制),而对于C++,首要考虑的是如何构造一个对象模型,让这个模型能够契合与之对应的问题域,这样就可以通过获取对象的状态信息得到输出实现过程...6). c++const成员为只读变量可以通过指针修改const成员的值,另外const成员变量只能在初始化列表中进行初始化。 下面我们通过代码来看看区别。...用于去掉变量的const属性 b. 转换的目标类型必须是指针或者引用 拓展 C++,普通类型可以通过类型转换构造函数转换为类类型,那么类可以转换为普通类型吗?答案是肯定的。...静态成员变量类外单独分配存储空间,位于全局数据区,因此静态成员变量的生命周期不依赖于类的某个对象,而是所有类的对象共享静态成员变量; 3). 可以通过对象名直接访问公有静态成员变量; 4)....三目运算符 C中三目运算符(? :)的结果仅仅可以作为右值,比如如下的做法C编译器下是会报错的,但是C++却是可以通过的。

1.4K10

C++ 语言】C++字符串 ( string 类 | 创建方法 | 控制台输出 | 字符串操作 | 栈内存字符串对象 | string* )

: 该 string 类定义 iostream 头文件 , 不必引入另外的头文件 ; #include ---- C++ 字符串 对象 创建方法 C++ 字符串 对象 创建方法...string_c_plus_2.c_str() << endl; Java 输出 String 对象 , 默认会调用其 toString 方法 , 但是 C 可以直接使用 ; ----...: 类型名称& 变量名 = 对应类型变量名称 ; // ② 引用数据类型的使用方法 : 直接当做原来的变量使用即可, 可以替换原来变量的位置使用 //引用类型解析 : // ① int& 是引用数据类型...字符串 , 也可以打印变量 // ② 输出 cout << 字符串变量1 << 字符串变量2 ... << endl 可以拼接 输出信息 cout << "string_c : " << string_c...+ string 类 : 该类定义 iostream 头文件 //创建 string 类型对象有三种方法 : //① 直接使用字符串赋值 //② 调用构造方法赋值 //③ 最后可以调用

57220

【DB笔试面试397】Oracle,以下工具可以实现逻辑备份数据库对象整个数据库的是哪一项()

题目 Oracle,以下工具可以实现逻辑备份数据库对象整个数据库的是哪一项() A、SQL*Plus B、导出实用程序 C、导入实用程序 D、SQL*Loader A 答案 答案:...逻辑备份是指使用工具expexpdp将数据库对象的结构和数据导出到二进制文件的过程。当数据库对象被误操作而损坏后就可以使用工具impimpdp利用备份的文件把数据对象导入到数据库中进行恢复。...只专注于数据库的技术,更注重技术的运用 ● 作者博客地址:http://blog.itpub.net/26736162/abstract/1/ ● 本系列题目来源于作者的学习笔记,部分整理自网络,若有侵权不当之处还请谅解

76220

JNI 从入门到实践,万字爆肝详解!

如果使用局部变量指向对象不再使用对象可以手动显式置空,也可以等到方法返回时自动隐式置空。如果使用全局变量(static)指向对象不再使用对象时必须手动显式置空。...而 JNI 层作为 Java 层和 C/C++ 层之间的桥接层,那么它就会兼具两者的特点:对于 局部 Java 对象引用 JNI 层可以通过 NewObject 等函数创建 Java 对象,并且返回对象引用...对于局部引用可以通过 DeleteLocalRef 函数手动显式释放(这类似于 Java 显式置空局部变量),也可以等到函数返回时自动释放(这类似于 Java 中方法返回时隐式置空局部变量);...全局 Java 对象引用: 由于局部引用在函数返回后一定会释放,可以通过 NewGlobalRef 函数将局部引用升级为 Global 型全局变量,这样就可以方法使用对象(这类似于 Java 中使用...5.4 比较引用是否指向相同对象 可以使用 JNI 函数 IsSameObject 判断两个引用是否指向相同对象(适用于三种引用类型),返回值为 JNI_TRUE 时表示相同,返回值为 JNI_FALSE

1.8K20

常见c和cpp面试题目汇总(一)

3、C++支持函数重载,C不支持函数重载 4、C++中有引用,C不存在引用的概念 二、C++中指针和引用的区别: 1、 指针是一个新的变量,存储了另一个变量的地址,我们可以通过访问这个地址来修改另一个变量...;引用只是一个别名,还是变量本身,对引用的任何操作就是对变量本身进行操作,以达到修改变量的目的 2、引用只有一级,而指针可以有多级 3、指针传参的时候,还是值传递,指针本身的值不可以修改,需要通过引用才能对指向的对象进行操作...只有虚函数才使用的是动态绑定,其他的全部是静态绑定 十五、引用是否能实现动态绑定,为什么引用可以实现: 可以。...因为引用指针)既可以指向基类对象可以指向派生类对象,这一事实是动态绑定的关键。用引用指针)调用的虚函数在运行时确定,被调用的函数是引用指针)所指的对象的实际类型所定义的。...函数一旦结束,形参生命也宣告终结,做出的修改一样没对任何变量产生影响。 用引用作为返回值最大的好处就是在内存不产生被返回值的副本。 但是有以下的限制: 1)不能返回局部变量引用

1.2K31

C++面试知识总结

C++程序的内存布局与C程序布局类似,区别是C++不再区分全局变量和静态变量是否已经初始化,全部存储静态存储区;另外堆存放new/delete申请释放的资源,而malloc和free申请的资源存放在自由存储区...引用在创建的同时必须初始化,保证引用对象是有效的,所以不存在NULL引用。 指针定义的时候不必初始化,所以,指针则可以是NULL,可以定义后面的任何地方重新赋值。...程序会给指针变量分配内存区域,而引用不需要分配内存区域。 返回引用时,在内存不产生被返回值的副本。...2.12 如何引用一个全局变量 同一文件:直接引用。 咋不同文件:直接引用头文件;使用extern声明变量。...,派生类的成员函数可以访问基类的公有和受保护成员;公有继承时基类受保护的成员,可以通过派生类对象访问但不能修改。

1.7K41

从字符串来浅谈Rust内存模型

在这篇文章,我将尝试通过字符串的实现来对Rust的存储管理进行分析。本文的目标读者是对Rust没有了解了解不多的初学者。...因此构建返回对象时,C++将使用字符串的移动构造器。移动构造器征用了result堆上的内存,并在栈上分配了结构体,而这就是ret变量对应的std::string对象。...Rust的内存管理 上一节已经介绍了C++的字符串,可以看到C++强大的表达能力下是可以实现开销相对小的字符串的(个人觉得比较完美)。...Rust的字符串类似C++,但是它将移动升级为语言的一种核心机制,并配合其他机制共同保证内存安全。 所有权:转移的安全 Rust,传参、返回甚至变量绑定等都默认进行移动操作。...而Rust的解决方案也和字符串一样:给指针引入管理对象C++这种管理对象也叫智能指针,由标准库提供。

91510

C++复习笔记——C++ 关键字

这是 C++ 的一种特殊的函数。 throw throw(抛出)用于实现 C++ 的异常处理机制,可以通过 throw关键字"抛出"一个异常。...export 为了访问其他编译单元(如另一代码文件)变量对象,对普通类型(包括基本数据类、结构和类),可以利用关键字 extern,来使用这些变量对象时;但是对模板类型,则必须在定义这些模板类对象和模板函数时...用其声明的变量函数应该在别的文件同一文件的其它地方定义(实现)。文件内声明一个变量函数默认为可被外部使用。 C++ ,还可用来指定使用另一语言进行链接,这时需要与特定的转换符一起使用。...typeid 指出指针引用指向的对象的实际派生类型。 char char(字符,character)类型,C++ 的基本数据结构,其值一般为 0~255 的 int。...void void(空的),可以作为函数返回值,表明不返回任何数据;可以作为参数,表明没有参数传入(C++不是必须的);可以作为指针使用。

1.3K30

Java基础系列(十七):Object类(上)

源码展示 Object源码解析如下 //该方法主要是为了服务于JNI的,它主要是提供了java类的方法与对应C++代码的方法的映射,方便jvm查找调用C++的方法。...,具体是用C(C++)DLL实现的,然后通过JNI调用。...equals方法 Object类的equals方法用于检测一个对象是否等于另一个对象Object类,这个方法将判断两个对象是否具有相同的引用。如果两个对象具有相同的引用,它们一定是相等的。....; 7) 子类定义equals方法的时候,首先会调用父类的equals.如果检测失败,对象不可能相等。...所以,如果在子类重新定义equals,就要在其中包含调用 super.equals(other)。 提示:对于数组类型的域,可以使用静态的Arrays.equals方法检测相应的数组元素是否想等。

36630
领券