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

news2024/9/21 18:49:42

        欢迎来到博主 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++ >  专栏系列持续更新 ,欢迎订阅关注 !

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

多无人车自动编队

matlab2016b可运行 Kaveh Fathian - Distributed Formation Control of Cars with Collision Avoidance (google.com)

极致呈现系列之:Echarts桑基图的流动旋律

目录 什么是桑基图桑基图的特点及应用场景Echarts中桑基图的常用属性Vue3中创建桑基图美化桑基图 在各种复杂系统中&#xff0c;我们经常需要了解不同流量之间的关系和流动情况。这种信息的可视化呈现对于我们理解系统的结构和转移过程至关重要。桑基图作为一种强大的可视化工具…

Lambda and Collections

我们先从最熟悉的Java集合框架(Java Collections Framework, JCF)开始说起。 为引入Lambda表达式&#xff0c;Java8新增了java.util.funcion包&#xff0c;里面包含常用的函数接口&#xff0c;这是Lambda表达式的基础&#xff0c;Java集合框架也新增部分接口&#xff0c;以便与…

tf卡打不开怎么办?tf卡数据丢失怎么恢复

TF卡打不开怎么办&#xff1f;当TF卡中的数据丢失后&#xff0c;又如何恢复呢&#xff1f;下面小编已为您梳理和归纳了答案&#xff01;请继续阅读下文。 一、TF卡打不开怎么办&#xff1f; 首先&#xff0c;我们需要了解导致TF卡读不出来的具体原因&#xff0c;这可能包括没…

ch8_4中断系统

为什么需要中断&#xff1f; 输入&#xff0c;输出。 计算机程序调试&#xff1b;发生异常事件&#xff1b; 都需要由中断系统进行处理. 引发中断的各种因素包括&#xff1a;人为设置中断&#xff0c;程序性事故&#xff0c; 硬件故障&#xff0c;I/O设备&#xff0c;外部事件等…

英伟达驱动安装

https://zhuanlan.zhihu.com/p/60307377 https://www.nvidia.cn/Download/index.aspx?langcn

路由器的工作原理详解

什么叫路由&#xff1f; 路由器的英文是 Router&#xff0c;也就是「找路的工具」。找什么路&#xff1f;寻找各个网络节点之间的路。 换句话说&#xff0c;路由器就像是快递中转站&#xff0c;包裹会经过一个个的中转站&#xff0c;从遥远的地方寄到你家附近&#xff0c;数据…

驱动开发:内核远程线程实现DLL注入

在笔者上一篇文章《驱动开发&#xff1a;内核RIP劫持实现DLL注入》介绍了通过劫持RIP指针控制程序执行流实现插入DLL的目的&#xff0c;本章将继续探索全新的注入方式&#xff0c;通过NtCreateThreadEx这个内核函数实现注入DLL的目的&#xff0c;需要注意的是该函数在微软系统中…

Java多线程阻塞队列(BlockingDeque)的简析

目录 一.什么是阻塞队列(BlockingDeque) 二.阻塞队列有什么用? 三.运用阻塞队列来实现一个最简单的生产者消费者 四.模拟实现阻塞队列 一.什么是阻塞队列(BlockingDeque) 既然叫做阻塞队列,那么他就满足两个特性 1.队列:先进先出 2.阻塞:空了不让出,满了不让进 &#…

kali常用ping命令探测

ping 判断目标主机网络是否畅通 ping $ip -c 1其中&#xff0c;-c 1 表示发送一个数据包 traceroute 跟踪路由 traceroute $domain ARPING 探测局域网IP ARP&#xff08;地址解析协议&#xff09;&#xff0c;将IP地址转换成MAC地址arping $ip -c 1 #!/bin/ bash######…

云原生监控平台 Prometheus 从部署到监控

1.监控系统架构设计 角色 节点 IP地址 监控端 Prometheus &#xff0c;Grafana&#xff0c;node_exporter &#xff0c;Nginx 47.120.35.251 被监控端1 node_exporter 47.113.177.189 被监控端2 mysqld_exporter&#xff0c;node_exporter&#xff0c;Nginx&#xff…

Centos7下载安装mysql

参考文档&#xff1a;https://xie.infoq.cn/article/5da9bfdfbdaabf7b0b982ab6e https://blog.csdn.net/Lance_welcome/article/details/107314575 一、下载mysql 5.7 # 下载mysql5.7.42版本 wget https://cdn.mysql.com//Downloads/MySQL-5.7/mysql-5.7.42-linux-glibc2.12-…

Mysql 表的七种连接方式【附带练习sql】

连接 七种JOIN介绍 图形连接方式说明SQL内连接共有部分SELECT <select_list> FROM TableA A INNER JOIN TableB B ON A.Key B.Key;左连接A表独有共有部分SELECT <select_list> FROM TableA A LEFT JOIN TableB B ON A.Key B.Key;右连接B表独有共有部分SELECT &…

字符设备驱动内部实现原理解析以及分步注册流程和代码示例

1、字符设备驱动内部实现原理解析 原理&#xff1a;用户层调用 open() 函数打开设备文件&#xff0c;用ls-i查看inode号并找到与之对应的struct inode 结构体。在struct inode 结构体中&#xff0c;可以找到与文件关联的 struct cdev 设备驱动结构体。设备驱动结构体中包含了文…

Spring6 数据校验 Validation

1、Spring Validation概述 在开发中&#xff0c;经常遇到参数校验的需求&#xff0c;比如用户注册的时候&#xff0c;要校验用户名不能为空、用户名长度不超过20个字符、手机号是合法的手机号格式等等。如果使用普通方式&#xff0c;会把校验的代码和真正的业务处理逻辑耦合在一…

FL Studio 21中文永久版网盘下载(含Key.reg注册表补丁)

FL Studio 21全称Fruity Loops Studio&#xff0c;就是大家熟悉的水果编曲软件&#xff0c;一个全能的音乐制作软件&#xff0c;包括编曲、录音、剪辑和混音等诸多功能&#xff0c;让你的电脑编程一个全能的录音室。FL Studio 21版本发布了&#xff0c;为我们带来了多种新功能&…

在Centos Stream 9上Docker的实操教程(八) - Docker可视化管理工具

&#x1f337; 古之立大事者&#xff0c;不惟有超世之才&#xff0c;亦必有坚忍不拔之志 &#x1f390; 个人CSND主页——Micro麦可乐的博客 &#x1f425;《Docker实操教程》专栏以最新的Centos版本为基础进行Docker实操教程&#xff0c;入门到实战 &#x1f33a;《RabbitMQ》…

构建二叉树的两种情况【根据前序遍历和中序遍历 构造树】【根据后序遍历和中序遍历 构造树】

【根据前序遍历和中序遍历 构造树】【根据后序遍历和中序遍历 构造树】 6. 重建二叉树根据前序遍历和中序遍历 得到树 树的遍历 6. 重建二叉树 原题链接 根据前序遍历和中序遍历 得到树 过程如下&#xff1a; 首先根据前序遍历找到 根节点找到中序遍历中&#xff0c;该根节点…

C# Http 请求接口 Get / Post

目录 一、概述 二、创建 Web API 三、HttpRequestHelper 三、测试 结束 一、概述 get 和 post 请求&#xff0c;最早被用来做浏览器与服务器之间交互HTML和表单的通讯协议&#xff0c;后来又被广泛的扩充到接口格式的定义上&#xff0c;到目前为止&#xff0c;get / pos…

计算机网络综合实训——网络程序设计

计算机网络综合实训 网络程序设计 作者姓名 学号 所在院系 计算机与信息工程学院 学科专业名称 计算机科学与技术 导师及职称 柯宗武 教授 提交时间 2023/05/28 仿qq聊天的设计与实现 &#xff08;指导教师&#xff0c;柯宗武 教授&#xff09; &#xff08;湖北师范大学计…