详解C++ 拷贝构造函数和赋值运算符

标题:详解C++ 拷贝构造函数和赋值运算符

什么是拷贝构造函数和赋值运算符

在C++中,每一个类都有一个默认的拷贝构造函数和赋值运算符。拷贝构造函数和赋值运算符的作用是对一个已经存在的对象进行复制。

拷贝构造函数用于创建一个新对象并将某个已经存在的对象的值赋给它。赋值运算符则在已有对象上操作。

拷贝构造函数

拷贝构造函数的定义格式如下:

ClassName(const ClassName &object);

其中,ClassName是类名,object是另一个与ClassName相同类型的对象。拷贝构造函数的作用是将参数对象的值复制到当前对象中。

假设有以下的代码:

#include <iostream>
using namespace std;

class Person {
public:
    // 构造函数
    Person(const char *s = "", int a = 0) : age(a) {
        name = new char[strlen(s) + 1];
        strcpy_s(name, strlen(s) + 1, s);
    }
    // 拷贝构造函数
    Person(const Person &p) : age(p.age) {
        name = new char[strlen(p.name) + 1];
        strcpy_s(name, strlen(p.name) + 1, p.name);
    }
    // 析构函数
    ~Person() {
        delete[] name;
    }

    void ShowInfo() {
        cout << "Name: " << name << ", Age: " << age << endl;
    }

private:
    char *name;
    int age;
};

int main() {
    Person p1("Tom", 20);
    Person p2 = p1; // 这是拷贝构造函数的调用
    p1.ShowInfo();
    p2.ShowInfo();
    return 0;
}

运行结果:

Name: Tom, Age: 20
Name: Tom, Age: 20

可以看到,p2是通过p1的拷贝构造函数创建出来的,两个对象的属性值完全相同。

赋值运算符

赋值运算符的定义格式如下:

ClassName &operator=(const ClassName &object); 

其中,ClassName是类名,object是另一个与ClassName相同类型的对象。赋值运算符的作用是将参数对象的值赋给当前对象。

假设有以下的代码:

#include <iostream>
using namespace std;

class Person {
public:
    // 构造函数
    Person(const char *s = "", int a = 0) : age(a) {
        name = new char[strlen(s) + 1];
        strcpy_s(name, strlen(s) + 1, s);
    }
    // 拷贝构造函数
    Person(const Person &p) : age(p.age) {
        name = new char[strlen(p.name) + 1];
        strcpy_s(name, strlen(p.name) + 1, p.name);
    }
    // 赋值运算符
    Person &operator=(const Person &p) {
        if (this != &p) {
            delete[] name;
            name = new char[strlen(p.name) + 1];
            strcpy_s(name, strlen(p.name) + 1, p.name);
            age = p.age;
        }
        return *this;
    }
    // 析构函数
    ~Person() {
        delete[] name;
    }

    void ShowInfo() {
        cout << "Name: " << name << ", Age: " << age << endl;
    }

private:
    char *name;
    int age;
};

int main() {
    Person p1("Tom", 20);
    Person p2;
    p2 = p1; // 这是赋值运算符的调用
    p1.ShowInfo();
    p2.ShowInfo();
    return 0;
}

运行结果:

Name: Tom, Age: 20
Name: Tom, Age: 20

可以看到,p2是通过p1的赋值运算符创建出来的,两个对象的属性值完全相同。

总结

拷贝构造函数和赋值运算符是C++编程中必须掌握的内容。拷贝构造函数用于创建新对象,并从已有对象中复制值;赋值运算符则在已有对象上操作。在使用拷贝构造函数和赋值运算符时,需要注意深拷贝和浅拷贝的区别,避免出现内存泄漏等问题。另外,C++也提供了默认的拷贝构造函数和赋值运算符,在使用时需要对其进行调整,以满足具体的需求。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解C++ 拷贝构造函数和赋值运算符 - Python技术站

(0)
上一篇 2023年5月22日
下一篇 2023年5月22日

相关文章

  • C++实现学校运动会管理系统

    实现C++学校运动会管理系统可以按照以下步骤进行: 1. 确定系统需求和功能 首先需要确定学校运动会管理系统的具体需求和功能,包括但不限于以下几点: 学校各个学院和班级的参赛信息管理(包括报名、成绩等); 不同项目的成绩管理和排名显示; 按照学院、班级等分类统计成绩和排名; 系统安全性和用户权限管理。 2. 构建系统框架和设计数据结构 根据需求和功能,可以设…

    C 2023年5月23日
    00
  • Spring单元测试类ApplicationTests错误的解决

    一、背景当我们使用Spring Boot框架进行开发时,经常会需要编写单元测试类来保证代码的正确性。在编写单元测试类时,我们经常需要继承Spring Boot提供的基类 – ApplicationTests来构建应用上下文环境,但是在某些情况下,我们可能会遇到一些错误,比如: java.lang.IllegalArgumentException: Could…

    C 2023年5月23日
    00
  • C++实现LeetCode(121.买卖股票的最佳时间)

    C++实现LeetCode(121.买卖股票的最佳时间) 题目描述 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。 如果你最多只允许完成一笔交易(即买入和卖出一支股票一次),设计一个算法来计算你所能获取的最大利润。 注意:你不能在买入股票前卖出股票。 示例 1: 输入: [7,1,5,3,6,4] 输出: 5 解释: 在第2天(股票价格 =…

    C 2023年5月23日
    00
  • csinsm32.exe是安全的进程吗 csinsm32进程有哪些用处

    关于“csinsm32.exe是安全的进程吗 csinsm32进程有哪些用处”的完整攻略,可以分为以下几个方面进行讲解: 1. 什么是csinsm32.exe进程 csinsm32.exe进程是属于某些电脑工具软件的一部分,比如知名的Chrome的插件格式工具CrxMouse。这个进程通常只在具备特定的软件环境下才会被启动,一般只有在你运行与其相关的软件时才…

    C 2023年5月23日
    00
  • C++深复制和浅复制讲解

    C++中的复制操作包含深复制和浅复制两种方式。简单来说,浅复制只复制指针而不复制指针指向的内存空间,而深复制会复制指针和指针指向的内存空间。 一般情况下,我们需要使用深复制,以避免浅复制造成指针指向错误的情况。 深复制的实现方式 在C++中,可以通过使用拷贝构造函数和赋值操作符实现深复制。 拷贝构造函数 拷贝构造函数是一种特殊的构造函数,用于在创建对象时,用…

    C 2023年5月23日
    00
  • win10蓝屏0xc0000001安全模式进不了怎么办?win10出现0xc0000001的解决方法

    win10蓝屏0xc0000001安全模式进不了的解决方法 如果你在使用win10时,突然遇到了蓝屏问题,并且提示0xc0000001错误代码,那么该怎么办呢?事实上,很多用户在此遇到问题时感到很困惑,接下来,我们将为大家详细讲解win10蓝屏0xc0000001安全模式进不了的解决方法,帮助大家轻松摆脱此问题。 方法一:通过修复启动 修复启动是一种通用的解…

    C 2023年5月23日
    00
  • 如何利用C++实现mysql数据库的连接池详解

    如何利用C++实现mysql数据库的连接池详解 什么是数据库连接池 数据库连接池是一种用来缓存数据库连接的技术,它可以提高数据库的访问效率,避免重复连接数据库导致的资源浪费和性能下降。在高并发的情况下,数据库连接池会发挥更大的优势。 如何利用C++实现mysql数据库的连接池 1. 安装mysql C++ Connector mysql C++ Connec…

    C 2023年5月22日
    00
  • C 标准库 stddef.h

    C标准库stddef.h是C语言出现的最早的标准库之一,其提供了一些基础类型和宏定义,包括NULL指针、指针运算等。在开发C程序时,经常会使用到该标准库中定义的类型和宏。下面我将详细介绍该库的使用方法和示例。 1. 头文件 使用C标准库stddef.h,需要在程序中引入该头文件,通常情况下,头文件会在程序文件开头引入,如下所示: #include <s…

    C 2023年5月10日
    00
合作推广
合作推广
分享本页
返回顶部