C++中拷贝构造函数的使用

yizhihongxing

下面我将为您详细讲解C++中拷贝构造函数的使用攻略。

什么是拷贝构造函数

在C++中,拷贝构造函数是一种特殊的构造函数,它用于将一个已有的对象复制到一个新对象中。拷贝构造函数的特殊之处在于它只有一个入参,且该入参为当前类的对象的引用,通常被称为复制构造函数。

拷贝构造函数具有如下特点:

  • 它是一种特殊的构造函数,其函数名为类名。
  • 它只有一个入参,类型为当前类的对象的引用。
  • 它通过将入参的值逐一复制构造一个新对象。
  • 当创建对象时,如果没有显式地定义拷贝构造函数,则系统会默认生成拷贝构造函数,其原型为类名(const 类名&)

在何时使用拷贝构造函数

以下是拷贝构造函数的使用场景:

  1. 当使用一个对象来初始化同类型的另一个对象时,会调用该对象的拷贝构造函数。

  2. 当函数的形参是类的对象时,函数调用时,会调用该对象的拷贝构造函数,用实参来初始化形参。

  3. 当函数的返回值是类的对象时,函数返回时,会调用该对象的拷贝构造函数,将函数内的局部变量复制给函数外的变量。

下面将分别介绍以上三种情况下的代码实现。

示例代码1:使用一个对象初始化同类型的另一个对象

#include <iostream>
using namespace std;

class Person
{
public:
    string name;
    int age;
    Person(string name, int age)
    {
        this->name = name;
        this->age = age;
        cout << "调用了构造函数!" << endl;
    }
    Person(const Person &p)
    {
        this->name = p.name;
        this->age = p.age;
        cout << "调用了拷贝构造函数!" << endl;
    }
};

int main()
{
    Person p("张三", 20);  // 调用了构造函数!
    Person p1 = p;        // 调用了拷贝构造函数!
    cout << "p1的信息为:" << p1.name << " " << p1.age << endl;
    return 0;
}

上述代码中,我们定义了一个Person类,其中包含两个属性nameage,以及两个构造函数:一个普通的构造函数和一个拷贝构造函数。在main函数中,我们创建了一个Person对象p,并通过p1=p的方式使用p来初始化同类型的另一个对象p1,最后输出p1中的数据。

运行结果如下:

调用了构造函数!
调用了拷贝构造函数!
p1的信息为:张三 20

示例代码2:函数的形参是类的对象

#include <iostream>
using namespace std;

class Person
{
public:
    string name;
    int age;
    Person(string name, int age)
    {
        this->name = name;
        this->age = age;
        cout << "调用了构造函数!" << endl;
    }
    Person(const Person &p)
    {
        this->name = p.name;
        this->age = p.age;
        cout << "调用了拷贝构造函数!" << endl;
    }

    void printInfo(Person p1)  // 函数的形参是类的对象
    {
        cout << "姓名:" << p1.name << " 年龄:" << p1.age << endl;
    }
};

int main()
{
    Person p("张三", 20);  // 调用了构造函数!
    p.printInfo(p);        // 调用了拷贝构造函数!
    return 0;
}

上述代码中,我们新增了一个成员函数printInfo,该函数的形参是类的对象。我们在main函数中将p对象传入该函数中,函数内部会通过拷贝构造函数来复制一份p对象,然后输出其中的数据。

运行结果如下:

调用了构造函数!
调用了拷贝构造函数!
姓名:张三 年龄:20

示例代码3:函数的返回值是类的对象

#include <iostream>
using namespace std;

class Person
{
public:
    string name;
    int age;
    Person(string name, int age)
    {
        this->name = name;
        this->age = age;
        cout << "调用了构造函数!" << endl;
    }
    Person(const Person &p)
    {
        this->name = p.name;
        this->age = p.age;
        cout << "调用了拷贝构造函数!" << endl;
    }

    Person getPerson()  // 函数的返回值是类的对象
    {
        Person p("张三", 20);
        return p;
    }
};

int main()
{
    Person p1 = p.getPerson();  // 调用了构造函数和拷贝构造函数!
    cout << "p1的信息为:" << p1.name << " " << p1.age << endl;
    return 0;
}

上述代码中,我们新增了一个成员函数getPerson,该函数的返回值是类的对象。我们在main函数中使用getPerson函数来返回一个Person对象,并将其赋值给p1对象,最后输出其中的数据。

运行结果如下:

调用了构造函数!
调用了拷贝构造函数!
p1的信息为:张三 20

至此,C++中拷贝构造函数的使用攻略就讲解完毕了。希望能给您带来帮助!

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++中拷贝构造函数的使用 - Python技术站

(0)
上一篇 2023年6月26日
下一篇 2023年6月26日

相关文章

  • 利用Android实现比较炫酷的自定义View

    实现自定义View可以通过继承View或者ViewGroup类的方式,然后在重写相应的方法并添加相应的逻辑来实现。 以下是实现比较炫酷的自定义View的完整攻略: 1.确定需求 在开始开发之前,首先要明确自己开发的自定义View的功能和用途,需要考虑以下几个问题: 自定义View的基本形态和样式是怎样的? 自定义View需要支持那些交互操作,例如点击、滑动等…

    other 2023年6月25日
    00
  • xcode好用的插件(随时更新)

    Xcode好用的插件(随时更新) Xcode是一款强大的集成开发环境,可以帮助开发者快速开发iOS和macOS应用程序。Xcode还支持插件,可以扩展其功能,提高开发效率。本文将介绍一些好用的Xcode插件,并提供两个示例说明。 1. 插件管理工具 在安装和管理Xcode插件之前,需要先安装插件管理工具。可以使用以下命令在终端中安装Alcatraz插件管理工…

    other 2023年5月9日
    00
  • js中生成map对象的方法

    以下是使用标准的Markdown格式文本,详细讲解在JavaScript中生成Map对象的方法的完整攻略: JavaScript中生成Map对象的方法 方法一:使用Map构造函数和数组 // 创建一个空的Map对象 let map = new Map(); // 添加键值对到Map对象 map.set(‘key1’, ‘value1’); map.set(‘…

    other 2023年10月15日
    00
  • 使用Netty搭建服务端和客户端过程详解

    “使用Netty搭建服务端和客户端过程详解”是一篇针对Netty初学者的教程,旨在介绍如何使用Netty框架来实现服务端和客户端的通信。本教程将详细阐述如何使用Netty搭建服务端和客户端,包括如下几个方面: Netty框架的基本介绍:介绍Netty的基本概念并简单介绍Netty的几个核心组件和它们的作用。 创建服务端:介绍如何在Netty框架下创建一个服务…

    other 2023年6月25日
    00
  • Android 应用Crash 后自动重启的方法小结

    请参考以下内容: Android 应用 Crash 后自动重启的方法小结 背景 在 Android 应用的开发过程中,我们时常需要遇到应用 Crash 的情况。而有时候,我们并不想用户看到应用崩溃的画面,希望应用可以自动重启。那么如何实现这个功能呢? 方法 1. 使用 UncaughtExceptionHandler 可以通过实现 UncaughtExcep…

    other 2023年6月27日
    00
  • C语言中全局数组和局部数组的问题

    下面我就来详细讲解一下“C语言中全局数组和局部数组的问题”的完整攻略。 全局数组和局部数组概念及区别 全局数组 全局数组是定义在程序的外层,函数的外面,不属于任何函数;访问全局数组时,不需要传递数组作为函数参数,就可以在程序的任何地方访问它。全局数组在定义时默认初始化为 0,或者指定初始值。全局数组的作用域为整个程序,生命周期和整个程序的生命周期一样长。 局…

    other 2023年6月25日
    00
  • thinkphp3(结构 路由 模板的调用 后台搭建 系统常量)

    thinkphp3:结构、路由、模板的调用、后台搭建和系统常量 ThinkPHP 3 是一款基于 MVC 设计模式的 PHP 开发框架,是国内最流行的 PHP 框架之一。它采用了优秀的设计理念和良好的代码结构,非常适合企业级 Web 应用开发。本篇文章将介绍 ThinkPHP 3 框架的结构、路由、模板的调用、后台搭建和系统常量。 结构 ThinkPHP 3…

    其他 2023年3月29日
    00
  • win7系统ip地址冲突怎么解决? Win7显示ip地址冲突的三种解决办法

    Win7系统IP地址冲突解决攻略 当在Windows 7系统中遇到IP地址冲突时,可以采取以下三种解决办法来解决问题。下面将详细介绍每种解决办法,并提供两个示例说明。 解决办法一:重新分配IP地址 打开控制面板:点击开始菜单,选择“控制面板”。 进入网络和共享中心:在控制面板中,点击“网络和 Internet”,然后点击“网络和共享中心”。 打开适配器设置:…

    other 2023年7月31日
    00
合作推广
合作推广
分享本页
返回顶部