10020 复制构造函数

以其他对象作为参数创建对象时


# Student.h
Student(Student&);

# Student.cpp
// 复制构造函数
Student::Student(Student& student)
{
    strcpy(m_name,student.m_name);
    m_age=student.m_age;
    strcpy(m_addr,student.m_addr);
}

# main.cpp

Student student;
Student stu(student);
类对象(传值)作为函数参数时

void func(Student stu)
{
  cout<<stu.getAge();
}

// 执行了复制构造函数
func(student);


### C++ 复制构造函数的定义、作用及是否属于构造函数的范畴 #### 1. 复制构造函数的定义 复制构造函数是一种特殊的构造函数,用于通过已存在的对象初始化另一个新对象。其形式通常为 `ClassName(const ClassName& other)`,其中参是一个对常量引用的对象[^1]。它在特定情况下被调用,例如当一个对象以值传递的方式传入函或从函返回时。 示例代码: ```cpp class Complex { public: Complex() {}; Complex(const Complex& c) { // 复制构造函数 std::cout << "调用复制构造函数!!" << std::endl; } }; ``` #### 2. 复制构造函数的作用 复制构造函数的主要作用是确保新创建的对象拥有与原对象相同的状态,同时避免浅拷贝可能带来的问题。例如,如果类中包含指针成员,直接赋值可能导致多个对象共享同一块内存,从而引发未定义行为。通过自定义复制构造函数,可以实现深拷贝[^2]。 #### 3. 复制构造函数是否属于构造函数的范畴 复制构造函数确实属于构造函数的一种类型。它与其他构造函数(如默认构造函数、带参构造函数等)一样,用于初始化对象。不同之处在于,复制构造函数专门用于通过已存在的对象来初始化新对象[^3]。 #### 4. 复制构造函数的调用场景 复制构造函数在以下场景中会被调用: - 当一个对象以值传递的方式传入函时。 - 当一个对象从函返回时。 - 当使用一个对象初始化另一个新对象时[^2]。 示例代码: ```cpp Complex createComplex() { Complex c; return c; // 调用复制构造函数 } int main() { Complex c1; Complex c2 = c1; // 调用复制构造函数 return 0; } ``` #### 5. 自定义复制构造函数的必要性 并非所有情况下都需要自定义复制构造函数。如果类中只有基本据类型的成员变量,编译器生成的默认复制构造函数即可满足需求。然而,当类中包含动态分配的资源(如指针)时,需要自定义复制构造函数以避免资源泄漏或双重释放等问题[^4]。 ```cpp class MyClass { private: int* ptr; public: MyClass(int value) : ptr(new int(value)) {} MyClass(const MyClass& other) : ptr(new int(*other.ptr)) {} // 自定义复制构造函数 ~MyClass() { delete ptr; } }; ``` #### 6. 复制构造函数与赋值运算符的区别 复制构造函数和赋值运算符虽然都涉及对象的复制,但它们的用途不同。复制构造函数用于初始化新对象,而赋值运算符用于将一个已存在的对象赋值给另一个已存在的对象。需要注意的是,赋值运算符必须处理自赋值的情况。 示例代码: ```cpp MyClass obj1(10); MyClass obj2 = obj1; // 调用复制构造函数 obj2 = obj1; // 调用赋值运算符 ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

恒云客

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

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

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

打赏作者

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

抵扣说明:

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

余额充值