首页 > 其他分享 >44对象优化

44对象优化

时间:2024-03-04 21:58:15浏览次数:19  
标签:ma cout 对象 44 构造 int Test 优化

对象优化

对象优化的原则

  • 函数参数传递的过程中,对象优先按引用传递,不要按值传递,这样少形参的构造和析构
  • 函数返回对象时,优先返回一个临时对象,而不要返回一个定义过的对象,这样少一个函数中对象的构造析构
  • 接受返回值是对象的函数调用时,用初始化的方式接受,而不用先定义再赋值的方式,这样实现了临时对象拷贝构造目标对象优化,少了一个返回值临时对象。
#include <iostream>

using namespace std;

class Test {
public:
    Test(int a = 5, int b = 5) : ma(a), mb(b) { cout << "Test(" << ma << ", " << mb << ")" << endl; }

    ~Test() { cout << "~Test(" << ma << ", " << mb << ")" << endl; }

    Test(const Test &t) : ma(t.ma), mb(t.mb) {
        cout << "Test(const Test& t)" << "Test(" << ma << ", " << mb << ")" << endl;
    }

    Test &operator=(const Test &t) {
        cout << "operator=" << endl;
        ma = t.ma;
        mb = t.mb;
        return *this;
    }

    int get() {
        return ma + mb;
    }


    Test &operator+(const Test &t) {
        cout << "operator+" << endl;
        ma = t.ma + ma;
        return *this;
    }

    void setMa(int ma) {
        this->ma = ma;
    }

private:
    int ma;
    int mb;
};

//不能返回临时对象的指针或者引用
Test func(Test t1, Test t2) { //实参->形参拷贝构造,如果是传引用就少了t1和t2的拷贝构造和析构
//    cout << t1.get() << endl << t2.get() << endl;
    Test t = t1 + t2;  //operator+,然后拷贝构造,这里没有临时对象
//    cout << t1.get() << endl << t2.get() << endl;
    t.setMa(20);
    return t;
    //拷贝构造临时对象保存t,析构t,t1,t2
}

Test t1(10, 10); //全局变量在main函数执行前构造,main函数结束后析构

int main() {
    Test t1;
    cout << "----------------------" << endl;
    Test t2(t1);
    cout << "----------------------" << endl;
    Test t3 = t1;
    cout << "----------------------" << endl;
    Test(20, 30);  //临时对象的构造和析构
    cout << "----------------------" << endl;
    Test t4 = Test(20, 30);  //C++编译器对对象构造的优化:用临时对象产生新对象时,是直接构造新对象,而并没有产生临时对象且拷贝构造
    cout << "----------------------" << endl;
    t4 = Test(30, 30);  //临时对象的构造,赋值运算符重载,临时对象的析构
    cout << "----------------------" << endl;
    t4 = (Test) 30;  //整数强制类型转换->class,编译器查询合适的构造函数,隐式产生一个临时对象,同时调用等号重载
    t4 = 31;
    cout << "----------------------" << endl;
//    Test* p = &Test(40);  //不安全的,部分编译器编译不过

    Test *p1 = new Test[2];
    cout << "----------------------" << endl;
    delete[] p1;
    cout << "----------------------" << endl;
    const Test &ref = Test(50); // 是ok的,临时对象不会被马上析构
    cout << "----------------------" << endl;
    static Test t5 = Test(24, 24); // 程序运行结束时析构
    cout << "----------------------" << endl;
    t5 = func(t1, t2); //函数调用时,从实参->形参,进行拷贝构造初始化,返回的临时对象会在该语句结束后析构
    cout << "----------------------" << endl;
}

Test t10(20, 30); //全局变量在main函数执行前构造,main函数结束后析构
#include <iostream>
using namespace std;

class Test
{
public:
    Test(int data = 10) : ma(data) { cout << "Test(" << ma << ")" << endl; }
    ~Test() { cout << "~Test(" << ma << ")" << endl; }
    Test(const Test& t) : ma(t.ma) { cout << "Test(const Test& t)" << endl; }
    void operator = (const Test& t)
    {
        cout << "operator =" << endl;
        ma = t.ma;
    }
    int getData() const { return ma; }
private:
    int ma;
};

//Test GetObject(Test t) // 不能返回局部的或者临时的对象的指针或引用
//{
//    int val = t.getData();
//    Test tmp(val);
//    return tmp;
//}
//
//int main()
//{
//    Test t1;
//    Test t2;
//    t2 = GetObject(t1);
//    return 0;
//}

Test opti_GetObject(Test &t) // 不能返回局部的或者临时的对象的指针或引用
{
    int val = t.getData();
    return Test(val);
}

int main()
{
    Test t1;
    Test t2 = opti_GetObject(t1);

    return 0;
}

标签:ma,cout,对象,44,构造,int,Test,优化
From: https://www.cnblogs.com/sio2zyh/p/18052800

相关文章

  • 42函数对象
    函数对象#include<iostream>usingnamespacestd;/*template<typenameT>boolmygreater(Ta,Tb){  returna>b;}template<typenameT>boolmyless(Ta,Tb){  returna<b;}*//*1.通过函数对象调用operator(),可以省略函数的调用开销,比通过函数......
  • JAVA面向对象基础:封装,实体JavaBean
     封装: 封装设计对象规范:合理隐藏,合理暴露 即类中使用的public与private关键字合理使用(只暴露对对象数据操作的方法,不暴露数据,故在对象中用private来封装数据,用public来封装方法)将成员变量保护起来,将get与set方法暴露出来供相关操作。将需要外界访问的成员方法用public,不......
  • Flask请求扩展与g对象
    请求扩展1before_request任意一次请求来了,都会执行这个装饰器装饰的函数(与Django中process_request类似)@app.before_requestdefbefore_request():print('请求来了')2after_request任意一次请求走了,就会执行这个装饰器装饰的函数(与Django中process_response类似......
  • JAVA面向对象基础:this关键字
    this;this就是一个变量,可以用在方法中,来拿到拿到当前对象   this的应用场景:this主要用来解决变量名称冲突问题的。   this真正解析: ......
  • 快速排序的三种实现及简单优化(内附代码实现)
    概念​ 先贴一段百度:快速排序采用的是分治思想,即在一个无序的序列中选取一个任意的基准元素key,利用key将待排序的序列分成两部分,前面部分元素均小于或等于基准元素,后面部分均大于或等于基准元素,然后采用递归的方法分别对前后两部分重复上述操作,直到将无序序列排列成有序序列。步......
  • springframework BeanUtils 复制java对象属性值 copyProperties
    importorg.springframework.beans.BeanUtils;importorg.springframework.beans.BeanWrapper;importorg.springframework.beans.BeanWrapperImpl;importjava.beans.PropertyDescriptor;importjava.util.HashSet;importjava.util.Set;/***ObjectBeanUtils*......
  • 洛谷题单指南-搜索-P1443 马的遍历
    原题链接:https://www.luogu.com.cn/problem/P1443题意解读:无论是国际象棋还是中国象棋,马的活动范围都是一样的:只不过国际象棋棋子是在格子中,中国象棋棋子是在交点,坐标的变化方式是一样的,根据此活动范围,计算马到达每一个点的最短路径。解题思路:根据马的活动范围,在棋盘内进行B......
  • RGB和YCbCR 的420/444格式
    目录RGBYUVYCbCrRGBRGB图像具有三个通道R、G、B,分别对应红、绿、蓝三个分量,由三个分量的值决定颜色;通常,会给RGB图像加一个通道alpha,即透明度,于是共有四个分量共同控制颜色。那么对于一张1920*1080的图片,如果采用RGBA编码格式,这一张图片加载到内存并在设备中显示时,所占用的内......
  • vue项目的优化方法有哪些?
    Vue项目的优化是一个综合考虑多方面因素的过程,包括代码、性能、资源、打包等方面。下面是一些常见的Vue项目优化方法:代码层面优化:组件拆分:将大型组件拆分成小型组件,提高组件的复用性和可维护性。避免不必要的计算:尽量减少不必要的计算,避免重复计算。使用异步组件:对于......
  • SEO网站优化排名机制
    新站期:刚上线不久的新站(1——3个月),搜索引擎还没有计算并赋予页面得分收录少,收录周期短,页面得分低,网站综合权重不高,排名能力较弱无页面得分阶段:搜索引擎收录了你的页面,还没有计算,或通过计算之后并没有赋予页面得分页面得分阶段(随机性排名阶段):网站排名80%的权力是搜索引擎机器识......