【带头学C++】----- 九、类和对象 ---- 9.2 构造函数

目录

9.2 构造函数

9.2.1 构造函数的概述

9.2.2 构造函数定义方法(初始化构造函数)

9.2.3 提供构造函数的影响


9.2 构造函数

以下是一些C++引入构造函数的原因:

  1. 初始化对象:构造函数允许在创建对象时立即初始化该对象的成员变量。通过在构造函数中指定初始值,可以确保对象在使用之前具有合适的初始状态,避免了未初始化的对象和潜在的错误。未初始化的对象和成员,在使用中很容易造成未知的错误,所以尽量要避免使用未初始化的对象。

  2. 参数化对象初始化:构造函数可以接受参数,并使用这些参数来设置对象的状态。这样,通过在创建对象时传递不同的参数,可以方便地初始化不同的对象实例。

  3. 自定义对象的实例化方式:通过定义不同类型的构造函数,可以实现不同的对象实例化方式。例如,可以指定不同的构造函数来处理不同的参数组合,从而实现重载的构造函数。

  4. 类型转换和隐式构造:C++允许使用单参数的构造函数作为隐式转换的一部分。这使得可以通过将一个特定参数的类型隐式地转换为对象类型来创建和初始化对象。

简单理解一件事:初始化是在程序第一次运行时给变量和函数设定初始值的过程。比如,如果我们希望一个用来计数的整数变量初始值为0,就需要在程序启动时对这个变量进行初始化,即设置初始值为0。引入类和对象后,构造函数就成为了初始化对象的特殊函数。当我们创建对象时,构造函数会运行,负责对对象的成员变量进行赋值和执行其他操作。我们可以在构造函数中初始化和赋值普通成员变量和函数,确保对象在创建时有适当的状态和行为。通过构造函数的使用,我们能够灵活地初始化对象,满足不同需求。

9.2.1 构造函数的概述

       类在实例化对象的时候,系统自动调用构造函数完成对象的初始化。如果用户不提供构造函数编译器会自动添加一个默认的构造函数(空函数)。

        C++为了给我们提供这种问题的解决方案,构造函数析构函数,这两个函教将会被编译器自动调用,完成对象初始化和对象清理工作。无论你是否需要,对象的初始化和清理工作是编译器强制我们要做的事情,即使你不提供初始化操作和清理操作,编译器也会给你增加默认的操作,

9.2.2 构造函数定义方法(初始化构造函数)

      构造函数名和类名相同,没有返回值类型(连void都不可以),可以有参数(可以重载)先给对象开辟空间(实例化) 然后调用构造函数(初始化)。在public权限下进行构造函数的定义。

 

 代码:

#include <iostream>

using namespace std;

class Data{
public:
    int mA;
public:

    //无参构造函数
    Data(){
        mA = 0;
        cout << "无参构造函数" << endl;
    }
    //有参构造函数
    Data(int a){
        mA = a;
        cout << "有参构造函数 ,mA = " << mA << endl;
    }

};


void test01(){
    //隐式调用无参构造函数(推荐写法)
    Data da1;
    //显示调用无参构造函数
    Data da2 = Data();
    //隐式调用有参构造函数(推荐写法)
    Data da3(10);
    //显示调用有参构造函数
    Data da4 = Data(11);

    //匿名对象(无参) 当前语句结束后立即自动释放该对象
    Data();
    Data(20);

    //构造函数隐式转换
    Data da5 = 111;//适用于类中只有一个数据成员

}

int main()
{
    test01();
    return 0;
}

9.2.3 提供构造函数的影响

如果用户不提供任何构造函数 编译器默认提供一个空的无参构造如果用户定义了构造函数(不管是有参、无参),编译器不再提供默认构造函数

第一种情况,对象没有构造函数时怎么办?(此时系统会提供默认的构造和析构函数)

 案例代码:

class Data{
public:
    int mA;
public:
#if 0
    //无参构造函数
    Data(){
        mA = 0;
        cout << "无参构造函数" << endl;
    }
#endif

#if 0
    //有参构造函数
    Data(int a){
        mA = a;
        cout << "有参构造函数 ,mA = " << mA << endl;
    }
#endif
};

void test02(){
    Data da1;
    cout << da1.mA <<endl;
}

第二种情况,提供一个有参构造函数。定义对象时使用无参构造对象。此时不管如何,系统都不会给你定义新的无参或者有参构造函数。

 代码:(此源码报错,注意甄别)

class Data{
public:
    int mA;
public:
#if 0
    //无参构造函数
    Data(){
        mA = 0;
        cout << "无参构造函数" << endl;
    }
#endif

#if 1
    //有参构造函数
    Data(int a){
        mA = a;
        cout << "有参构造函数 ,mA = " << mA << endl;
    }
#endif
};

void test02(){
    Data da1;
    cout << da1.mA <<endl;
}

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

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

相关文章

C#常用运算符的优先级

前言 运算符在C#编程语言中扮演着重要的角色&#xff0c;用于执行各种计算和操作。了解运算符的优先级是编写高效和正确代码的关键。本文将深入探讨C#中38个常用运算符的优先级划分和理解&#xff0c;并提供详细的说明和示例&#xff0c;以帮助读者更好地理解运算符的使用。 目…

sql语句排除相同元素

数据库表如图所示&#xff0c;重复的&#xff0c;我只要登录用户名下的车位号并且不重复 使用下面这种语句就会呈现下面那张图 public List<CarplaceNumber> getAllCarplaceNumberList(String substring1) throws SQLException {QueryRunner r new QueryRunner(DataSou…

超大规模集成电路设计----学习框架(一)

本文仅供学习&#xff0c;不作任何商业用途&#xff0c;严禁转载。绝大部分资料来自----数字集成电路——电路、系统与设计(第二版)及中国科学院段成华教授PPT 超大规模集成电路设计----学习框架&#xff08;一&#xff09; 这门课在学什么&#xff1f;这门课该怎么学&#xf…

Windows启动nacos操作文档

Windows启动nacos操作文档 1、新建数据库nacos_config 2、导入nacos\conf\nacos-mysql.sql文件 /******************************************/ /* 数据库全名 nacos_config */ /* 表名称 config_info */ /******************************************/ CREATE T…

(数据结构)顺序表的查找

静态分配代码&#xff1a; #include<stdio.h> #include<stdlib.h> #define MAX 100 typedef struct LinkList {int data[MAX];int lenth; }Link; //初始化 void CreateList(Link* L) {L->lenth 0;for (int i 0; i < MAX; i){L->data[i] 0;} } //插入 …

C++动态内存管理new,delete

C动态内存管理new&#xff0c;delete 1.C/C内存分布2.C语言中的内存管理方式3.C中的内存管理方式new&#xff0c;delete3.1C中的内置类型new&#xff0c;delete3.2new&#xff0c;delete操作自定义类型3.3 new和delete匹配 4. operator new与operator delete函数4.1new和delete…

FISCO-BCOS 在ARM系统架构搭建节点(国密版)

问题&#xff1a; 使用 fisco-bcos v2.9.1 搭建一个节点&#xff0c;批量上链1000条数据&#xff0c;在上链200条-400条数据之间节点会出现异常&#xff0c;导致后面数据不能上链。 系统环境 操作系统&#xff1a;统信 查看系统构架 ld -version rootuos-PC:/# ld -version …

深入探索网络协议:揭开互联网运作的奥秘(建议收藏)

随着如今数字化时代的到来&#xff0c;互联网已经成为我们日常生活中不可或缺的一部分。然而&#xff0c;我们是否曾好奇过互联网是如何运作的&#xff1f;它是如何将我们与世界连接起来的&#xff1f;答案就在网络协议中&#xff0c;这是互联网背后的语言。 网络协议的作用和功…

网站更换IP的四大注意事项

1.对网站当中的数据进行备份 网站更换IP时可以将页面的数据库文件和站点文件通过下载工具在本地完成备份。 2.更换解析域名 从站点域名管理后台当中更换域名地址&#xff0c;改为新的IP地址。 3.确保IP安全 在用户更换IP前一定要确定IP是否安全&#xff0c;一旦IP存在不良…

python系统调用执行ping命令无法检测到超时情况(破案了:ping命令-W参数单位为s,我写了个1000)

文章目录 问题描述破案了&#xff1a;ping命令-W参数单位为s&#xff0c;我写了个1000。。。,,ԾㅂԾ,, 问题描述 我用了系统调用去执行ping&#xff0c;一开始用os.system()&#xff0c;有问题&#xff0c;后面用subprocess问题还是存在&#xff0c;后来我把这个改了&#xff…

CookieSession Redis 到JWT会话管理历史

单应用时期&#xff0c;通常使用 Cookies 和 Session 进行会话管理。 用户登录后&#xff0c;服务器创建一个唯一的会话标识符&#xff08;Session ID&#xff09;&#xff0c;将其存储在浏览器的 Cookies 中&#xff0c;并在服务端维护一个关联该标识符的会话对象。 这种方…

Woocommerce Private Store私人商店秘密商城插件,适合批发商店,会员制俱乐部

点击访问原文Woocommerce Private Store私人商店秘密商城插件&#xff0c;适合批发商店&#xff0c;会员制俱乐部 - 易服客工作室 WooCommerce Private Store插件是使 WooCommerce 私有的简单方法。密码保护您的整个 WooCommerce 商店并使其隐藏。 非常适合批发商店、会员制俱…

线程安全问题之死锁

作者简介&#xff1a; zoro-1&#xff0c;目前大二&#xff0c;正在学习Java&#xff0c;数据结构&#xff0c;javaee等 作者主页&#xff1a; zoro-1的主页 欢迎大家点赞 &#x1f44d; 收藏 ⭐ 加关注哦&#xff01;&#x1f496;&#x1f496; 线程安全问题之死锁 一个线程&…

基于减法平均优化器优化算法(SABO)-极限学习机(ELM)的时间序列预测模型matlab代码

极限学习机&#xff08;Extreme Learning Machine, ELM&#xff09;或“超限学习机”是一类基于前馈神经网络&#xff08;Feedforward Neuron Network, FNN&#xff09;构建的机器学习系统或方法&#xff0c;适用于监督学习和非监督学习问题。ELM在研究中被视为一类特殊的FNN&a…

亚马逊云科技 re:Invent 2023:科技前沿风向标,探索未来云计算之窗

文章目录 一、前言二、什么是亚马逊云科技 re:Invent&#xff1f;三、亚马逊云科技 re:Invent 2023 将于何时何地举行四、亚马逊云科技 re:Invent 2023 有什么内容&#xff1f;4.1 亚马逊云科技 re:Invent 2023 主题演讲4.2 亚马逊云科技行业专家探实战 五、更多亚马逊云科技活…

C++11【下】

欢迎来到Cefler的博客&#x1f601; &#x1f54c;博客主页&#xff1a;那个传说中的man的主页 &#x1f3e0;个人专栏&#xff1a;题目解析 &#x1f30e;推荐文章&#xff1a;题目大解析&#xff08;3&#xff09; 目录 &#x1f449;&#x1f3fb; 新的类功能类成员变量初始…

基于算能的AI边缘计算盒子,内置强悍TPU | 32TOPS INT8算力

边缘计算盒子 内置强悍TPU | 32TOPS INT8算力 ● 支持浮点运算的TPU平台盒子&#xff0c;支持32TOPSINT8&#xff0c;16TFLOPSFP16&#xff0c;2TFLOPSFP32高算力 ● 单芯片最高支持32路H.264 & H.265的实时解码能力 ● 支持国产算法框架Paddle飞桨&#xff0c;适配Caf…

Linux--初识和基本的指令(3)

目录 1.前言 1.指令 1.1 cat指令 1.2 echo指令 1.3 more 指令 1.4 less指令 1.5 什么时候使用less和more 1.6 head指令 1.7 tail指令 1.8 wc指令 1.9 与时间相关的指令 1.9.1 date指令 1.9.2 cal指令 1.10 16.find指令&#xff1a;&#xff08;灰常重要&#x…

Python学习路线 - Python语言基础入门 - 准备工作

Python学习路线 - Python语言基础入门 - 准备工作 初识PythonPython的优点 什么是编程语言Python环境安装Windows系统Python安装Python验证 MacOS系统Linux系统 第一个Python程序常见问题 Python解释器Python解释器概念Python解释器存放位置Python解释器运行".py"文件…

Android File Transfer for Mac:畅享强大的安卓文件传输工具

作为一款功能强大的安卓文件传输工具&#xff0c;Android File Transfer for Mac&#xff08;以下简称AFT&#xff09;为Mac用户提供了便捷快速的安卓设备文件管理体验。无论是传输照片、音乐、视频还是文档&#xff0c;AFT都能满足你的需求&#xff0c;让你的文件传输更加高效…