C++ -- N种构造 / 拷贝构造的优化

本文通过日期类Date为例,详细分析了C++中构造、拷贝构造、引用传递和返回值在不同场景下的使用,包括函数传参、函数返回值以及临时对象的处理。通过实例探讨了编译器的优化,如RVO(返回值优化)、NRVO(无名临时对象返回值优化)等,展示了如何减少不必要的构造和拷贝,提高代码效率。
摘要由CSDN通过智能技术生成
1 以日期类为例

日期类的代码如下(只包含4个默认成员函数,为了便于观察结果所以在4个成员函数里面输出一些语句):

class Date
{
public:
      Date()
      {
           cout << "Date()" << endl;
      }

      Date(const Date& d)
      {
           cout << "Date(const Date& d)" << endl;
      }
      Date& operator =(const Date& d)
      {
           cout << "Date& operator=(const Date& d)" << endl;
           return *this;
      }
      ~Date()
      {
           cout << "~Date()" << endl;
      }
};

2 函数传参时

Date对象作为参数,此时不考虑返回值的问题,函数的返回值为void

2.1 Date对象作为参数采用传值方式

1.函数代码如下:

void fun1(Date d) 
{}

2.函数调用的场景:
①创建对象与函数调用不在同一行

int main()
{
      Date d1;   
      fun1(d1);
      system("pause");
      return 0;
}
  • 分析
    在main函数里面首先会创建一个对象d1,则会调用一次构造函数;接下来调用fun1函数时,由于fun1是值传递,所以会调用拷贝构造函数将d1拷贝构造给d。当出了fun1函数作用域后,会调用析构函数清理掉d;当fun1函数调用结束后,发现d1也没有再使用,也会调用d1的析构函数。综上:会调用一次构造,一次拷贝构造及两次析构函数。但是调用d1的析构函数只有在main函数快结束时,按F11可以进入Date的析构函数,此时无法输出到显示屏上。

  • 验证(运行结果如下)
    这里写图片描述

②创建对象与函数调用在同一行(此时编译器会进行优化)
说明:因为我们有时候只是想调用一下某个函数,所以可以创建匿名对象,这里创建的对象为匿名对象Date(),匿名对象的作用域只在当前一行。

fun1(Date());
  • 分析:
    首先会创建一个Date的匿名对象,调用fun1时,会用这个匿名对象去拷贝构造一个d对象,编译器则会优化,会将两个步骤合二为一,则只会构造一个对象,所以只会调用一次构造函数,也只会调用一次析构函数。
  • 验证:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值