详解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语言实现打印星号图案的攻略,我可以提供如下内容: 标题 C语言实现打印星号图案的完整攻略 代码块 #include <stdio.h> int main() { int i, j, n = 5; for(i = 1; i <= n; i++) { for(j = 1; j <= i; j++) { printf("* …

    C 2023年5月30日
    00
  • 你的电脑设备需要修复0xc000007b无法开机怎么办?(附解决办法)

    你的电脑设备需要修复0xc000007b无法开机怎么办?(附解决办法) 问题描述 当你尝试开机时,显示出现错误0xc000007b,导致无法正常启动计算机。该错误代码通常是由于操作系统损坏或重要的系统文件丢失所导致的。 解决方案 以下是解决电脑无法开机的方法: 方法1:重建启动记录 这个问题通常可以通过重建启动记录并修复损坏的引导文件来解决。你可以使用Win…

    C 2023年5月23日
    00
  • C++ main函数的几点细节

    下面是对于 “C++ main函数的几点细节” 的详细解释: 1. main函数的返回值类型 在C++中 main 函数一般定义为 int main() 或 int main(int argc, char* argv[])。其中,int指定了 main 函数的返回值类型,表示程序的执行结果是否成功。通常情况下,程序执行成功时返回0,否则返回一个非零值。 下面…

    C 2023年5月22日
    00
  • C++实现简易通讯录管理系统

    C++实现简易通讯录管理系统 项目简介 本文主要介绍如何使用C++实现一个简易的通讯录管理系统,基本功能包括添加联系人信息、显示通讯录中的联系人信息、删除联系人信息、查找联系人信息、修改联系人信息。 实现步骤 定义联系人结构体 c++ struct Person { string name; // 姓名 int age; // 年龄 string phone…

    C 2023年5月23日
    00
  • C++直接cout指针名的含义?

    当我们在C++中使用std::cout输出一个指针变量时,可以直接输出这个指针变量的名称,如下所示: int* p = new int(10); std::cout << p << std::endl; 这时输出直接的结果会是这个指针变量的地址值,而不是指针所指向的值或者其他内容。这样输出指针的地址值在某些情况下是有用的,比如如果想要…

    C 2023年5月30日
    00
  • HKC疾风系列SG27C/SG27QC/SG27CPLUS三款显示器对比评测

    HKC疾风系列SG27C/SG27QC/SG27CPLUS三款显示器对比评测 简介 本文将对HKC疾风系列SG27C/SG27QC/SG27CPLUS三款显示器进行全方位评测对比,分析它们的优缺点,从而帮助广大用户更好地了解这三款产品,以便于选择合适自己的显示器。 参数对比 参数对比 SG27C SG27QC SG27CPLUS 屏幕尺寸 27英寸 27英寸…

    C 2023年5月23日
    00
  • Visual Studio Code配置C/C++开发环境的教程图解

    下面是详细的攻略: Visual Studio Code配置C/C++开发环境的教程图解 一、安装Visual Studio Code 首先,我们需要安装Visual Studio Code,可以直接在官网下载安装包进行安装。安装完成后,打开VS Code。 二、安装C/C++扩展 在VS Code中,我们需要安装C/C++扩展,为C/C++开发提供支持。在…

    C 2023年5月23日
    00
  • Python标准库之数据库 sqlite3

    下面是Python标准库之数据库sqlite3的完整攻略。 什么是sqlite3 SQLite是一个嵌入式的、轻量级的关系型数据库管理系统,它不需要单独的服务器进程或操作系统进程来运行。同时SQLite数据库文件可以在不同操作系统平台之间共享和使用。sqlite3是Python内置的一个轻量级数据库模块,支持大多数常规的SQL语句和操作,可以用于Python…

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