首页 > 其他分享 >返回值为对象的情况_其实无区别

返回值为对象的情况_其实无区别

时间:2024-02-01 16:58:01浏览次数:21  
标签:cout 区别 对象 int cpp 返回值 tmpObj

g++ -fno-elide-constructors tmpObj.cpp -o tp

/*
 * tmpObj.cpp
 *
 *  Created on: 2021年6月1日
 *      Author:
 */

#include <iostream>
using namespace std;

class A {
public:
    int m_k;
    int m_t;
    A() {
            cout << "A() construct...." << endl;
            m_k = 0;
            m_t = 0;
        }
    A(int k, int t) :m_k(k), m_t(t) {
        cout << "param construct...." << endl;
    }
    ~A() {
        cout << "destruct...." << endl;
    }
    A(const A &a) {
        cout << "copy construct..." << endl;
    }
};

//  如果函数返回值是一个对象,要考虑return语句的效率
A getObj() {
        /************** 返回本地对象 ****************/
              /* 以下这种写法实际上执行了三步:
                  1. 构造本地对象a
                  2. 调用拷贝构造,将本地对象a拷贝到外部存储器
                  3. 调用析构函数析构本地对象a
              */
         /******************************************/
    A a(3, 4);
    return a;
}

//  如果函数返回值是一个对象,要考虑return语句的效率
A getDirectObj() {
    /***********  直接返回临时对象  *************/
    // 编译器直接把临时对象创建并初始化在外部
    // 存储单元(主调函数的栈帧上)中,省去了拷
    // 贝和析构的花费,提高了效率
    /*****************************************/
    return A(3, 4);
}

class B{
public:
    int val;
public:
    B(int val):val(val) {}
};

int main() {
//    A a0 = getObj();   //  外部存储单元
//    A a = getDirectObj();

//    param construct....
//    copy construct...
//    destruct....
//    destruct....
//    getObj();   //  外部存储单元
    getDirectObj();
//    B& b1 = B(3); // 报错
    const B& b2= B(3); // 正确
    return 0;
}

 

标签:cout,区别,对象,int,cpp,返回值,tmpObj
From: https://www.cnblogs.com/tryst/p/18001604

相关文章

  • pandas - reset_index() 函数 将Series对象转换为一个新的DataFrame
    #df=pd.read_excel(r"D:\PyCharm\年度数据处理\1月设备离线01.xlsx",sheet_name='Sheet2')#value_counts=df['解除时间'].value_counts().reset_index()#print(value_counts)这段代码的作用是对DataFrame中的"解除时间"列进行值计数,并将结果保存在一个新的DataFrame......
  • Android系统中/system/priv-app/和/system/app/以及/system_ext/app/的区别
    在Android系统中,这三个目录都是与应用程序相关的,但它们在系统中的位置和用途上有一些区别。/system/priv-app/目录:该目录包含被认为是系统的一部分的特权应用程序(privilegedapps)。特权应用程序通常是由设备制造商或ROM开发者预先安装的,它们在系统中运行时具有更高的权限。......
  • Java和JavaScript区别与联系
    JavaScript和java属于两门语言。参考了java语言,“看上去与Java足够相似,但是比Java简单”,是简化版Java语言。特别是在定义对象变量的时候,省略的太极端了。java里有的很多常用类型的对象在js中是没有的。JavaScript由原网景(Netscape)公司的高级工程师布兰登·艾奇(BrendanEich)(曾经的M......
  • 实模式和保护模式的区别
    实模式和保护模式是指计算机在不同工作模式下的运行状态和功能。实模式(RealMode):实模式是早期的x86计算机运行的基本模式,它提供了最初的兼容性,与早期的8086和80286处理器兼容。运行在实模式下的计算机仅能访问1MB的物理内存,并且没有内存保护机制。实模式使用物理地址寻址方......
  • 方法重载和方法重写的区别
    方法重载和方法重写的区别1.什么是方法重载?方法重载(MethodOverloading)是指在同一个类中,可以定义多个方法具有相同的名称,但是参数列表不同。重载的方法可以有不同的参数类型、不同的参数个数,或者参数类型的顺序不同。方法重载的目的是提高代码的灵活性和可读性。方法重载的规则......
  • R语言社区检测算法可视化网络图:ggplot2绘制igraph对象分析物种相对丰度
    原文链接:http://tecdat.cn/?p=23836原文出处:拓端数据部落公众号我们使用R中的igraph包,产生了网络的图形。但是很难将这些图表放到演讲和文章中,因为图表很难根据需要定制。使用igraph中的绘图功能可以得到你想要的结果,但用ggplot对工作更有帮助。所以本文探索了一种在ggplot中创......
  • @bean 和@ component 区别 用法
     @bean里面没有component@Bean 和 @Component 都是 Spring 框架中用于定义和注册 bean 的注解,但它们的使用场景和方式有所不同。@Bean- @Bean 注解用在方法上,通常在配置类(带有 @Configuration 注解的类)中使用。- 它表示通过方法返回的对象应该被注册为 Spring......
  • Java中比较两个字符串==和.equals()区别
    ​在Java中,==和.equals()都是用于比较两个字符串是否相等的运算符,==比较的是两个字符串的引用地址,而.equals()比较的是两个字符串的内容。只有当两个字符串变量指向同一个字符串对象时,==和.equals()才会返回相同的结果 参考文档:Java中比较两个字符串==和.equals()区......
  • Java的面向对象
    面向对象什么是面向对象面向对象思想:物以类聚,分类的思维方式。面向对象适合处理复杂的问题,适合处理需要多人协作的问题属性+方法=类面对象的本质:以类的方式组织代码,以对象的组织(封装)数据。三大特性:封装继承多态回顾方法及加深方法的定义:修饰符返回类型break:跳出sw......
  • [职场] 学位证和毕业证的区别 学位证没有拿到怎么补救
    学位证书,又称学位证,是为了证明学生专业知识和技术水平而授予的证书,在我国学位证授予资格单位为通过教育部认可的高等院校或科学研究机构。毕业证书亦称“文凭”。是毕业生所取得的一种学历凭证。它表明持证者在某一级学校系统地学习过一定的科学文化知识,是选拔干部和评定职务的重要......