只有把对象用值传递时,才会调用复制构造函数,如果传递引用,则不会调用复制构造函数。由于这一原因,传递比较大的对象时,传递引用会比传值的效率高很多

文章讲述了C++中按值和按引用传递对象的区别,以及复制构造函数的调用情况。强调了避免复制大型对象以提高性能,提倡使用引用或指针。还解释了const修饰复制构造函数参数的原因:保证对象不变,允许常量对象复制,增强代码安全和优化潜力。

当您在C++中传递对象给函数时,根据传递方式的不同,编译器会决定是否调用复制构造函数。下面是一个例子,展示了按值传递对象和按引用传递对象的区别:

#include <iostream>
class MyClass {
public:
    MyClass() {
        std::cout << "构造函数被调用" << std::endl;
    }
    MyClass(const MyClass& other) {
        std::cout << "复制构造函数被调用" << std::endl;
    }
};
void funcByValue(MyClass obj) {
    // 函数内部操作
}
void funcByReference(const MyClass& obj) {
    // 函数内部操作
}
int main() {
    MyClass obj;
    std::cout << "按值传递对象:" << std::endl;
    funcByValue(obj); // 调用复制构造函数
    std::cout << "按引用传递对象:" << std::endl;
    funcByReference(obj); // 不调用复制构造函数
    return 0;
}

在这个例子中,MyClass 有一个默认构造函数和一个复制构造函数,两者都会输出一条消息以指示它们被调用了。
main 函数中,我们创建了一个 MyClass 的对象 obj。当我们按值传递 objfuncByValue 函数时,你会看到输出“复制构造函数被调用”,因为编译器创建了一个 obj 的副本。然而,当我们按引用传递 objfuncByReference 函数时,没有输出“复制构造函数被调用”,因为 obj 本身并没有被复制,而是传递了一个引用。
对于大型对象,避免复制可以显著提高性能,因为它减少了内存分配和复制的时间,并减少了内存使用。因此,在可能的情况下,应该尽量使用引用或指针传递对象,而不是按值传递。


MyClass(const MyClass& other)中为什么用const修饰?
在C++中,当一个对象以值的方式传递给函数或者从一个函数返回时,复制构造函数会被调用。复制构造函数的参数通常是一个同类对象的引用,并且这个引用通常会被声明为 const,这样做有几个原因:

  1. 避免无意修改源对象:通过将复制构造函数的参数声明为 const,可以确保在复制过程中不会修改源对象的值。这是复制构造函数的基本目的——创建一个副本,而不是修改原始对象。
  2. 允许常量对象被复制:如果一个对象是常量对象,那么只有 const 引用可以绑定到它。如果一个复制构造函数的参数不是 const,那么就不能用常量对象来初始化新对象。
  3. 提高代码安全性:使用 const 可以防止在复制过程中不小心修改了源对象,这样可以减少潜在的bug和意外行为。
  4. 优化编译器的潜在优化:当一个对象以 const 引用的方式传递时,编译器可能会进行一些优化,因为它知道这个对象不会被修改,这样可以生成更高效的代码。
    因此,MyClass(const MyClass& other) 中的 const 修饰符是为了确保在复制构造函数执行过程中,other 对象不会被修改,同时允许常量对象被复制,并提高代码的安全性和优化潜力。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

九层指针

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值