拷贝构造函数和赋值构造函数

本文介绍了C++中拷贝构造函数和赋值构造函数的概念及其应用场景。拷贝构造函数用于创建一个对象的副本,而赋值构造函数则是将一个对象的值赋给另一个已存在的对象。示例代码展示了如何定义和使用这两个构造函数,包括姓名和年龄的复制。在main函数中,可以看到拷贝构造函数在对象初始化和对象赋值时的不同调用情况。

拷贝构造函数是用一个对象初始化另外一个对象时候使用;

class student
{
public:
student()
{
  strcpy(name,"xxj");
  age =10;
};

student(const student &stu)//拷贝构造函数
{
   this.age = stu.age;
   stcpy(this.name,stu.name);

};

char *name[64];
int age;

}

int main()
{
student  stu;
student stu1(stu);//此时调用拷贝构造


}

赋值构造函数是有两个对象,用其中要给对象给另外一个对象赋值时候使用:

class student
{
public:
student()
{
  strcpy(name,"xxj");
  age =10;
};

student(char *name[64],int age)
{
  strcpy(this.name,name);
  age =10;
};


student(const student &stu)//拷贝构造函数
{
   this.age = stu.age;
   stcpy(this.name,stu.name);

};

char *name[64];
int age;

}

int main()
{
student  stu;
student stu1("xxj",18);//此时调用拷贝构造
stu = stu1;//此时调用赋值构造函数

}

### 拷贝构造函数赋值构造函数的区别及适用场景 #### 定义与基本区别 拷贝构造函数赋值运算符(通常称为赋值构造函数)是 C++ 中用于对象初始化赋值的两种机制。它们的主要区别在于使用场景行为。 - **拷贝构造函数**:当一个对象通过另一个已存在的对象进行初始化时,调用拷贝构造函数。它通常用于创建新对象并将其初始化为现有对象的副本[^2]。 - **赋值运算符**:当一个已存在的对象被赋予另一个对象的值时,调用赋值运算符。它用于将一个对象的内容复制到另一个已存在的对象中[^2]。 #### 使用场景 - **拷贝构造函数**: - 当通过一个对象初始化另一个对象时,例如 `MyClass b = a;`。 - 当函数参数按值传递时,例如 `void f(MyClass n)`[^1]。 - 当函数返回一个对象时,例如 `Complex Complex::add(Complex c)`[^1]。 - **赋值运算符**: - 当一个已存在的对象被赋予另一个对象的值时,例如 `c = a.add(b);`[^1]。 - 在动态分配对象或修改已有对象内容时,例如 `MyClass* p = new MyClass(); *p = a;`[^2]。 #### 示例代码分析 以下是一个示例,展示拷贝构造函数赋值运算符的不同行为: ```cpp #include <iostream> using namespace std; class MyClass { public: int x; int y; // 默认构造函数 MyClass() { x = 0; y = 0; } // 带参数的构造函数 MyClass(int a, int b) { x = a; y = b; } // 拷贝构造函数 MyClass(const MyClass& other) { x = other.x; y = other.y; cout << "拷贝构造函数调用" << endl; } // 赋值运算符重载 MyClass& operator=(const MyClass& other) { if (this == &other) { return *this; } x = other.x; y = other.y; cout << "拷贝赋值运算符调用" << endl; return *this; } }; int main() { MyClass a(5, 6); // 调用带参数构造函数 MyClass b = a; // 调用拷贝构造函数[^2] MyClass c; // 调用默认构造函数 c = a; // 调用拷贝赋值运算符 return 0; } ``` #### 输出结果分析 上述代码的输出结果为: ``` 拷贝构造函数调用 拷贝赋值运算符调用 ``` - 第一行输出表明在 `MyClass b = a;` 中调用了拷贝构造函数。 - 第二行输出表明在 `c = a;` 中调用了赋值运算符。 #### 深拷贝与浅拷贝 如果类中包含指针或其他需要动态分配资源的成员,则需要特别注意深拷贝拷贝的问题[^3]。默认的拷贝构造函数赋值运算符仅执行浅拷贝,可能导致多个对象共享同一资源,从而引发未定义行为。在这种情况下,必须显式实现深拷贝逻辑。 #### 编译器生成的默认实现 如果未显式定义拷贝构造函数赋值运算符,编译器会自动生成默认实现。默认实现按字节顺序逐个复制成员变量,适用于所有成员均为内置类型且无动态资源的情况[^4]。然而,对于包含动态分配资源的类,这种默认实现可能不适用,需要手动实现深拷贝逻辑。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值