【C++】构造函数调用规则

        欢迎来到博主 Apeiron 的博客,祝您旅程愉快 !时止则止,时行则行。动静不失其时,其道光明。


 

1、缘起

(1)默认情况下,C++ 编译器至少给一个类添加 3 个函数

        ①  默认构造函数(无参,函数体为空)

        ②  默认析构函数(无参,函数体为空)

        ③  默认拷贝构造函数,对属性进行值拷贝

(2)构造函数调用规则如下:

        ①  如果用户定义有参构造,C++ 不在提供默认无参构造,但是会提供默认拷贝构造

        ②  如果用户定义拷贝构造,C++ 不会再提供其他 构造函数(有参构造和无参构造)


 

2、示例代码

①  如果用户定义有参构造,C++ 不在提供默认无参构造,但是会提供默认拷贝构造

示例代码 1 :

#include <iostream>
#include <string>

using namespace std;

class Person
{
public:
    Person()
    {
        cout << "Person 默认构造函数的调用" << endl;
    }

    Person(int age)
    {
        cout << "Person 有参构造函数的调用" << endl;
        p_age = age;
        cout << endl;
    }

    ~Person()
    {
        cout << "Person 析构函数的调用" << endl;
    }

    Person(const Person& p)
    {
        cout << "Person 拷贝构造函数的调用" << endl;
        p_age = p.p_age;
        cout << endl;
    }

    int p_age = 0;
};


void test()
{
    Person p1(7);
    Person p2(p1);

    cout << "p2 的年龄:" << p2.p_age << endl;
    cout << endl;
}
int main()
{
    test();

    cout << endl;
    system("pause");
    return 0;
}

        上述代码中写了拷贝构造函数,在运行这行 Person p2(p1); 程序时,编译器会自动调用用户自定义的拷贝构造函数。那么,如果用户不自定义拷贝构造函数,编译器会执行怎么样的操作呢?请看示例代码 2。


示例代码 2 :

#include <iostream>
#include <string>

using namespace std;

class Person
{
public:
    Person()
    {
        cout << "Person 默认构造函数的调用" << endl;
    }

    Person(int age)
    {
        cout << "Person 有参构造函数的调用" << endl;
        p_age = age;
        cout << endl;
    }

    ~Person()
    {
        cout << "Person 析构函数的调用" << endl;
    }

    int p_age = 0;
};


void test()
{
    Person p1(7);
    Person p2(p1);

    cout << "p2 的年龄:" << p2.p_age << endl;
    cout << endl;
}
int main()
{
    test();

    cout << endl;
    system("pause");
    return 0;
}

上述代码中没有提供拷贝构造函数,但是编译器提供了一个默认的拷贝构造函数。在运行这行 Person p2(p1); 程序时,编译自动值拷贝 p1 的属性,然后将其赋值给 p2。 


示例代码 3:

#include <iostream>
#include <string>

using namespace std;

class Person
{
public:
    Person(int age)
    {
        cout << "Person 有参构造函数的调用" << endl;
        p_age = age;
        cout << endl;
    }

    ~Person()
    {
        cout << "Person 析构函数的调用" << endl;
    }

    Person(const Person& p)
    {
        cout << "Person 拷贝构造函数的调用" << endl;
        p_age = p.p_age;
        cout << endl;
    }

    int p_age = 0;
};


void test()
{
    Person p;
}
int main()
{
    test();

    cout << endl;
    system("pause");
    return 0;
}

        上述代码中用户自定义了有参构造函数,没有自定义默认构造函数。如果用户定义有参构造,编译器不在提供默认无参构造。此时,编译器出现报错。 


②  如果用户定义拷贝构造,C++ 不会再提供其他构造函数 

示例代码:

#include <iostream>
#include <string>

using namespace std;

class Person
{
public:
    Person(const Person& p)
    {
        cout << "Person 拷贝构造函数的调用" << endl;
        p_age = p.p_age;
        cout << endl;
    }

    int p_age = 0;
};


void test()
{
    Person p1(7);
    Person p2(p1);

    cout << "p2 的年龄:" << p2.p_age << endl;
    cout << endl;
}
int main()
{
    test();

    cout << endl;
    system("pause");
    return 0;
}

上述代码中只写了拷贝构造函数,编译器就给出了报错,这是因为如果用户定义拷贝构造,编译器不会再提供其他构造函数。 


 

3、总结

        本期的分享总结就到这里了,如果有疑问的小伙伴,我们在评论区交流嗷~~~,笔者必回,我们下期再见啦 !

博客中难免存在疏漏和错误之处,皆归因于作者水平有限,诚请各位读者不吝指正 !

< C++ >  专栏系列持续更新 ,欢迎订阅关注 !

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/31355.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

开源软件介绍——国内和国际主要开源社区

我是荔园微风&#xff0c;作为一名在IT界整整25年的老兵&#xff0c;今天我们来看一看国内和国际上有哪些主要开源社区。 开源社区的定义 开源社区又称为开放源代码社区&#xff0c;一般由拥有共同兴趣爱好的人组成。根据相应的开源软件许可证协议公布软件源代码的网络平台&a…

ChatGPT从入门到精通,深入认识ChatGPT

ChatGPT从入门到精通&#xff0c;一站式掌握办公自动化/爬虫/数据分析和可视化图表制作 全面AI时代就在转角 道路已经铺好了 “局外人”or“先行者” 就在此刻 等你决定1、ChatGPT从入门到精通&#xff0c;一站式掌握办公自动化/爬虫/数据分析和可视( 点击观看完整版本 )https…

Clickhouse之物化视图分享

前言 ClickHouse广泛用于用户和系统日志查询场景中&#xff0c;主要针对于OLAP场景&#xff0c;为业务方提供稳定高效的查询服务。在业务场景下&#xff0c;数据以不同的格式、途径写入到clickhouse。用传统JOIN方式查询海量数据&#xff0c;通常有如下痛点: 每个查询的代码冗…

CTFshow-pwn入门-前置基础pwn23-pwn25

pwn23-25的题目会涉及到ret2shellcode、ret2libc等内容&#xff0c;本篇文章只会侧重研究这几道题目的wp&#xff0c;不会过多涉及到ret2shellcode、ret2libc的基本原理&#xff0c;等有时间再来写关于ret2libc、ret2shellcode…的相关内容。大家可以参考CTFwiki的文章去慢慢学…

【机器学习】十大算法之一 “SVM”

作者主页&#xff1a;爱笑的男孩。的博客_CSDN博客-深度学习,活动,python领域博主爱笑的男孩。擅长深度学习,活动,python,等方面的知识,爱笑的男孩。关注算法,python,计算机视觉,图像处理,深度学习,pytorch,神经网络,opencv领域.https://blog.csdn.net/Code_and516?typeblog个…

Kubernetes(k8s)部署模式发展

目录 1 简介2 物理单机(~2000)2.1 主要代表 3 虚拟化&#xff1a;初期&#xff08;2001~2009&#xff09;3.1 VMware3.2 laaS 4 虚拟化&#xff1a;成熟期&#xff08;2010~至今&#xff09;4.1 OpenStack4.2 虚拟化四巨头 5 容器化:&#xff08;2013-至今&#xff09;5.1 Dock…

【备战秋招】每日一题:2023.04.26-华为OD机式-第三题-MC方块

在线评测链接:P1231 题目内容 MC最新版本更新了一种特殊的方块&#xff0c;幽匿催发体。这种方块能够吸收生物死亡掉落的经验并感染周围方块&#xff0c;使其变成幽匿块。Steve想要以此为基础尝试搭建一个经验仓库&#xff0c;他来到了创造超平坦模式&#xff0c;在只有草方块…

被测系统架构与数据流分析

开源项目litemall系统架构(https://github.com/linlinjava/litemall) 角色与数据用户产品前端技术栈后端技术栈数据存储 开源项目Mall的系统架构(https://github.com/macrozheng/mall) 角色与数据用户产品前端技术栈后端技术栈服务治理技术栈监控技术栈大数据处理技术栈数据存…

自动化测试工具 AirTest 的使用方法与简介

目录 前言&#xff1a; Airtest简介 1.基于图像识别的Airtest框架 2.基于UI识别的Poco框架 Airtest环境搭建 Airtest布局 Airtest使用步骤 第一步&#xff1a;连接移动设备 第二步&#xff1a;创建一个.air文件&#xff08;也就是我们的测试脚本&#xff09; 第三步&#xff1a…

【MySQL数据库 | 第二十篇】explain执行计划

目录 前言&#xff1a; explain&#xff1a; 语法&#xff1a; 总结&#xff1a; 前言&#xff1a; 上一篇我们介绍了从时间角度分析MySQL语句执行效率的三大工具&#xff1a;SQL执行频率&#xff0c;慢日志查询&#xff0c;profile。但是这三个方法也只是在时间角度粗略的…

如何在 XMind 中绘制流程图

XMind 是专业强大的思维导图软件,由于其结构没有任何限制,很多朋友特别喜欢用它来绘制流程图。禁不住大家的多次询问,今天 XMind 酱就将这简单的流程图绘图方法分享给大家。 在 XMind 中,绘制流程图的主角是「自由主题」和「联系」。它们可以打破思维导图的限制,让你自由…

Type-C PD显示器方案简介

方案概述 LDR6020 Type-C PD显示器方案可以给显示器提供一个全功能C口&#xff0c;支持手机&#xff0c;电脑&#xff0c;游戏主机等一线投屏功能&#xff0c;同时支持PD快充输出。LDR6020内置了 USB Power Delivery 控制器和 PD BMC PHY 收发器&#xff0c;支持PD2.0/3.0等快…

Java多线程与并发

1、JDK版本的选择 选择JDK8、JDK11进行讲解的原因&#xff1a;Oracle长期支持 2、进程和线程的区别 进程和线程的由来 3、进程与线程的区别 进程是资源分配的最小单位,线程是cpu调度的最小单位. 所有与进程相关的资源&#xff0c;都被记录在PCB(进程控制块)中。进程是抢占…

数学建模竞赛国赛入场券之攻略

数学建模竞赛国赛入场券之攻略 1.团队契合度 在3天的准备时间中&#xff0c;如果是临时组建的草台班子光处理分歧可能就已经耗掉一半时间&#xff0c;最好在赛前就完成磨合&#xff0c;像一起做模拟题练练手之类&#xff0c;甲准备图论、乙准备优化方法&#xff0c;然后再一块…

存储笔记8 ipsan

Module Objectives IP SAN的组件 IP SAN的好处 描述SAN中的IP融合及其影响 描述的基本架构 –iSCSI –FCIP –FCoE 讨论IP SAN技术的市场驱动因素 列出IP SAN技术 列出iSCSI的组件和连接选项 描述iSCSI体系结构和拓扑结构 解释iSNS操作 描述FCIP的体系结构 IP SAN互联…

Redis持久化机制与Redis事务

一、Redis 持久化机制 Redis 是个基于内存的数据库。那服务一旦宕机&#xff0c;内存中数据必将全部丢失。所以丢失数据的恢复对于 Redis 是十分重要的&#xff0c;我们首先想到是可以从数据库中恢复&#xff0c;但是在由 Redis 宕机时&#xff08;说明相关工作正在运行&#…

UDS系列-31服务(Routine Control)

诊断协议那些事儿 诊断协议那些事儿专栏系列文章,本文介绍例程控制服务RoutineControl,该服务的目的是Client端使用Routine Control服务来执行定义的步骤序列并获取特定序列的相关结果。这个服务经常在EOL、Bootloader中使用,比如,检查刷写条件是否满足、擦除内存、覆盖正…

Maven如何创建Maven web项目

1、创建一个新的模块: 1.1 使用骨架点一下&#xff0c;这里 1.2 找到maven-archetype-webapp项目&#xff0c;选中点击&#xff0c;一路next就行。 1.3 删除不必要的maven配置&#xff1a;&#xff08;这里我不需要&#xff0c;针对自己情况而定&#xff09; 可以从name这里开…

pr视频叠加,即原视频右上角添加另外一个视频方法,以及pr导出视频步骤

一、pr视频叠加&#xff0c;即原视频右上角添加另外一个视频方法 在使用pr制作视频时&#xff0c;我们希望在原视频的左上角或右上角同步播放另外一个视频&#xff0c;如下图所示&#xff1a; 具体方法为&#xff1a; 1、导入原视频&#xff0c;第一个放在v1位置&#xff0c;第…

案例 | 标杆引领!人大金仓智绘数字金融

随着中央数字经济政策推进金融业数字化建设&#xff0c;数字金融已初见成效&#xff0c;但尚存在信息安全缺乏保障、转型覆盖不全面等问题。 为实现金融行业全面数字化转型升级&#xff0c;作为数据库领域国家队&#xff0c;人大金仓紧跟国家战略&#xff0c;自主研发的系列数据…