面试题答案
一键面试- 代码示例:
#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;
}
- 原理分析:
- 在
main
函数中,首先创建了一个MyClass
对象myObj
,此时调用构造函数,输出Constructor called: data = 10
。 - 然后调用
printMyClass(myObj)
函数,这里myObj
作为参数传递给printMyClass
函数。由于函数参数是按值传递的,所以会创建一个myObj
的副本,这个过程就会调用拷贝构造函数。在拷贝构造函数中,新对象的data
成员变量被初始化为myObj
的data
值,输出Copy constructor called: data = 10
。 - 在
printMyClass
函数内部,打印出Inside printMyClass: data = 10
,这里操作的是传入对象的副本。
- 在
总结来说,当函数参数为对象时,由于按值传递的特性,会创建实参对象的副本,这个副本的创建过程就会调用拷贝构造函数,以便将实参对象的状态复制到新创建的副本对象中。