首页
学习
活动
专区
圈层
工具
发布
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    c++中引用作为返回值

    引用在c++里面可以说是一把利器,引用用的好的话可以写出非常精妙的程序。 引用的本质: 引用在C++中的内部实现是一个常指针。...这是C++为了实用性而做出的细节隐藏。...我们在写操作符重载的时候都是用引用作为函数的返回值,我们来看一段代码: int temp; int fun1() { temp = 10; return temp; } int& fun2...当执行语句“a = fun1();”的时候就会把临时变量的值再拷贝给a,假设这个临时变量是t,相当于做了这两个赋值的步骤:t = temp; a = t; 返回函数的引用 返回引用实际返回的是一个指向返回值的隐式指针...返回函数的引用去初始化一个新的引用 这个和前面一样,都是不会产生副本,但是现在是用返回值去初始化一个引用声明c,也就是说这时候变成了变量temp的别名,在c的生命周期内temp是一直有效的,这样做完全可以

    1.5K10

    C++ new关键字的返回值

    在C中,我们申请一块内存时,往往会根据malloc的返回值来判断是否为NULL而判定是否申请内存成功,但C++中,new关键字并不像malloc一样是有返回值的。所以以下语法是没有意义的语法。...既然没有返回值,难道我们就无法判断new是否申请成功吗?当然不是,想判断new是否申请成功,有两种方式。...使用new关键字时让其不抛出异常而真正有返回值 通过捕获异常判断是否申请成功(以后介绍) 我们只介绍一下第一种方法,捕获异常的版本我们会在专门讲异常的地方给出示例。...如下所示: //C++ 内存申请失败不抛出异常版本 int *q = new (std::nothrow)int[10]; if(q == NULL) return -1; 在new后面增加(std:...:nothrow)以后,new不再抛出异常,而是真正得到返回值。

    71430

    关于C++函数返回值的拷贝优化问题

    在传统C++程序中,如果函数的返回值是一个对象的话,可能需要对函数中的局部对象进行拷贝。如果该对象很大的话,则程序的效率会降低。...在C++ 11以后,出现的移动语义(Move Semantic)及拷贝优化(Copy Elision)都是解决这个问题的方法。本文试图以一个最简单的例子来说明这个问题。...结论对于C++函数返回一个大对象的时候,在编译器能进行拷贝优化的时候,会优先进行返回值的拷贝优化。...有了上述结论,我们在写程序的时候最佳实践是函数返回值可以直接返回函数体内定义的零时对象,但是我们需要在定义该对象的时候实现移动构造函数。...这样就可以保证函数的返回值要么有编译器拷贝优化,要么会调用移动构造函数减少拷贝开销。

    1.4K40

    关于C++函数返回值的拷贝优化问题

    在传统C++程序中,如果函数的返回值是一个对象的话,可能需要对函数中的局部对象进行拷贝。如果该对象很大的话,则程序的效率会降低。...在C++ 11以后,出现的移动语义(Move Semantic)及拷贝优化(Copy Elision)都是解决这个问题的方法。 本文试图以一个最简单的例子来说明这个问题。...结论 对于C++函数返回一个大对象的时候,在编译器能进行拷贝优化的时候,会优先进行返回值的拷贝优化。...有了上述结论,我们在写程序的时候最佳实践是函数返回值可以直接返回函数体内定义的零时对象,但是我们需要在定义该对象的时候实现移动构造函数。...这样就可以保证函数的返回值要么有编译器拷贝优化,要么会调用移动构造函数减少拷贝开销。

    89810

    【C++】C++ 引用详解 ⑤ ( 函数 “ 引用类型返回值 “ 当左值被赋值 )

    函数返回值 能作为 左值 , 是很重要的概念 , 这是实现 " 链式编程 " 的基础 ; 一、函数返回值不能是 " 局部变量 " 的引用或指针 1、函数返回值常用用法 在 C++ 语言中 , 函数返回值...一般不会直接作为左值 , 因为 函数返回值是一个临时对象 , 一般情况下 都是当做右值使用 , 函数 返回的值都是 其 函数内部 局部变量 的 副本 , 这些 副本 不能作为左值参与赋值操作 ;...如果 是 外部通过 函数参数 传入到函数中的 指针 / 引用 , 没有必要返回 , 外部已经有了 , 你再返回一次意义不大 ; 2、分析函数 " 普通返回值 " 做左值的情况 函数普通返回值 不能做左值...========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ========== 3、分析函数 " 引用返回值 " 做左值的情况 函数引用返回值 可以做左值 ; 下面的 fun2...为其 赋值 100 , 然后打印 之前获取的 引用值 , 值也变为 100 ; 函数的引用返回值 可以作为 左值使用 ; 函数返回值 做 左值 代码示例 : // 导入标准 io 流头文件 // 其中定义了

    1.5K30

    深度解读《深度探索C++对象模型》之返回值优化

    没有启用返回值优化时,怎么从函数内部返回对象当在函数的内部中返回一个局部的类对象时,是怎么返回对象的值的?...在上面从C++代码中加入拷贝构造函数:Object(const Object& rhs) { printf("Copy constructor\n"); memcpy(this, &rhs,...启用返回值优化后的效率提升那么启用NRV优化与不启用优化,两者之间的效率对比究竟差了多少?...返回值优化的缺点从测试结果来看,NRV优化看起来很美好,那么NRV优化是否一切都完美无缺呢?...其实NRV优化也存在一些不足或者说不尽如人意的地方:是否开启了NRV优化的问题,NRV优化并不是C++标准中规定的东西,各家编译器的实现未必一定支持它,或者说启用它的条件和规则也不尽相同,例如clang

    57120

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

    一、函数返回值不能是 " 局部变量 " 的引用或指针 1、引用通常做右值 之前使用 引用 时 , 都是作为 右值 使用 , 引用只在 声明 的 同时 进行初始化时 , 才作为左值 , // 定义变量 a...a = 10; // 定义变量 a 的引用 b int& b = a; 引用 声明 并 初始化 之后 , 就没有当过右值 , 这是因为 引用 的本质 是 指针常量 , 其本身不可被更改 ; 2、函数返回值特点...函数 的 返回值 几乎很少是 引用 或 指针 ; 函数 的 计算结果 经常是借用 参数中的 地址 / 引用 进行返回的 , 函数 的 返回值 一般返回一个 int 类型的值 , 如果 int 为 0...就是成功 , int 为其它数值 , 就是错误码 ; 3、函数内的 " 局部变量 " 的引用或指针做函数返回值无意义 如果 想要 使用 引用 或 指针 作 函数的计算结果 , 一般都是将 引用 和 指针..." 的 引用 或 指针 , 然后获取地址 , 发现获取的都是随机值 , 都是无意义的值 ; num21 = -858993460 , *num3 = -858993460 代码示例 : // 包含 C+

    2.9K20

    【C++】拷贝构造函数调用时机 ② ( 对象值作为函数参数 | 对象值作为函数返回值 )

    类的实例对象 以值的方式 传递给函数 , 不是以 指针 或 引用 的方式 ; // 定义函数, 接收 Student 对象值作为参数 void fun(Student s) { } ④ 对象值作为函数返回值...: 函数直接返回类的实例对象 值 , 不是返回 指针 或 引用 ; // 定义函数, 返回 Student 对象值作为返回值 Student fun() { Student s1(18, 170);...return s1; } 一、拷贝构造函数概念 ---- C++ 语言中的 拷贝构造函数 是 C++ 类中的 特殊构造函数 , 其作用是 创建一个新的 类实例对象 , 作为现有实例对象的 拷贝后的副本...Student s) { } 如果调用该函数 , 需要拷贝实参 , 将 实参的副本值 , 也就是对象值 传递给函数形参 , 这个过程需要调用 Student 类的 拷贝构造函数 ; 该操作 全程 由 C+..., 在栈内存中的 Student 对象也会被销毁 , 因此 Student 类型的返回值需要返回一个副本 , 这个副本需要调用 拷贝构造函数 创建 ; 2、代码示例 - 对象值作为函数返回值 代码示例

    2.1K20
    领券