函数的形参是类的对象时,为什么要调用拷贝构造函数,可以举例子说明吗
时间: 2024-03-18 22:39:08 浏览: 77
当函数的形参是类的对象时,如果使用该对象进行操作,会对该对象进行修改,这可能会影响到函数外部该对象的状态,因此需要在函数调用时创建该对象的副本,以确保函数操作的是一个独立的对象。这个副本的创建就需要调用拷贝构造函数。
举例来说,假设有一个Student类,其中包含学生的姓名和年龄信息。现在有一个函数printStudent,其形参是Student对象,用来打印该学生的信息。如果在函数内部直接修改该对象的年龄信息,就可能会影响到函数外部的该学生对象,因此需要在函数调用时创建该学生对象的副本,以确保打印的信息正确。
```
class Student {
public:
Student(string name, int age) : m_name(name), m_age(age) {}
Student(const Student& other) : m_name(other.m_name), m_age(other.m_age) {} // 拷贝构造函数
string getName() const { return m_name; }
int getAge() const { return m_age; }
void setAge(int age) { m_age = age; }
private:
string m_name;
int m_age;
};
void printStudent(Student stu) {
stu.setAge(20); // 在函数中修改年龄信息
cout << "Name: " << stu.getName() << ", Age: " << stu.getAge() << endl;
}
int main() {
Student stu("Tom", 18);
printStudent(stu); // 调用printStudent函数,创建stu的副本
cout << "Name: " << stu.getName() << ", Age: " << stu.getAge() << endl;
return 0;
}
```
在上面的例子中,调用printStudent函数时,会创建stu对象的副本,然后在函数内部修改该副本的年龄信息。由于这个副本是独立于原始的stu对象的,因此在函数外部打印stu对象的信息时,其年龄信息仍然是18。
阅读全文