MST

星途 面试题库

面试题:C++中拷贝构造函数在函数参数传递时的调用情况分析

请举例说明在C++中,当函数参数为对象时,拷贝构造函数是如何被调用的,并解释其原理。假设我们有一个简单的类`MyClass`,包含一个整数成员变量`data`,写出相关代码并分析。
49.4万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
  1. 代码示例
#include <iostream>

class MyClass {
public:
    int data;

    // 构造函数
    MyClass(int value) : data(value) {
        std::cout << "Constructor called: data = " << data << std::endl;
    }

    // 拷贝构造函数
    MyClass(const MyClass& other) : data(other.data) {
        std::cout << "Copy constructor called: data = " << data << std::endl;
    }
};

// 函数接受MyClass对象作为参数
void printMyClass(MyClass obj) {
    std::cout << "Inside printMyClass: data = " << obj.data << std::endl;
}

int main() {
    MyClass myObj(10);
    printMyClass(myObj);
    return 0;
}
  1. 原理分析
    • main函数中,首先创建了一个MyClass对象myObj,此时调用构造函数,输出Constructor called: data = 10
    • 然后调用printMyClass(myObj)函数,这里myObj作为参数传递给printMyClass函数。由于函数参数是按值传递的,所以会创建一个myObj的副本,这个过程就会调用拷贝构造函数。在拷贝构造函数中,新对象的data成员变量被初始化为myObjdata值,输出Copy constructor called: data = 10
    • printMyClass函数内部,打印出Inside printMyClass: data = 10,这里操作的是传入对象的副本。

总结来说,当函数参数为对象时,由于按值传递的特性,会创建实参对象的副本,这个副本的创建过程就会调用拷贝构造函数,以便将实参对象的状态复制到新创建的副本对象中。