通常,拷贝构造函数的形参是( ) A. 本类对象名 B. 本类对象的指针名 C. 本类对象的成员名 D. 本类对象的引用名
时间: 2024-03-30 08:40:54 浏览: 15
D. 本类对象的引用名 是通常作为拷贝构造函数的形参的。拷贝构造函数用于创建一个新对象,其内容与已有对象相同。因此,拷贝构造函数的形参应该是用于初始化新对象的已有对象的引用。如果形参不是引用类型,那么在调用拷贝构造函数时会发生对象的复制,这将导致无限递归调用拷贝构造函数,最终导致栈溢出。因此,选项A、B、C 都不正确。
相关问题
类对象作为函数形参时,拷贝构造函数是在什么时候调用
当将一个类对象作为函数的参数传递时,拷贝构造函数会被调用。这是因为在函数调用时,需要将实参复制到形参中,如果形参是一个类对象,那么就需要使用拷贝构造函数来完成这个复制过程。拷贝构造函数会创建一个新的类对象,其成员变量的值与原对象相同,但是它们在不同的内存地址中。
需要注意的是,如果形参是一个引用类型,那么拷贝构造函数不会被调用。此时,实参和形参都指向同一个对象。
函数的形参是类的对象时,为什么要调用拷贝构造函数,可以举例子说明吗
当函数的形参是类的对象时,如果使用该对象进行操作,会对该对象进行修改,这可能会影响到函数外部该对象的状态,因此需要在函数调用时创建该对象的副本,以确保函数操作的是一个独立的对象。这个副本的创建就需要调用拷贝构造函数。
举例来说,假设有一个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。