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

news2025/1/12 23:06:23

目录

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;
}

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

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

相关文章

数据挖掘实战-基于word2vec的短文本情感分析

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

微机原理——并行接口8255学习1

目录 并行接口特点 可编程并行接口芯片8255 8255端口地址 8255的三种工作方式 8255的两种命令&#xff08;方式命令和C端口命令&#xff09; 由用户扩展的并行接口8255的应用 声光报警器接口设计 步进电机控制接口设计 PA端口实现跑马灯 PB端口实现按键输入 并行接口特…

最大乘积分解(动态规划)

相较于我上一题写的动态规划&#xff0c;这一题比较简单 代码如下&#xff1a; #include<stdio.h>int main(void) {long long n, max[101] {0, 1};scanf("%lld", &n);for(int i 1; i < n; i)max[i] i;for(int i 1; i < n; i)for(int j 1; j &…

RT-Thread 汇编分析启动流程

文章目录 一、汇编指令二、启动文件三、流程图 一、汇编指令 这里介绍即几条最常见实用的汇编指令 LDR R0,[R1]&#xff1a;将R1指定内存地址数据&#xff0c;存储到寄存器R0中。STR R0,[R1,#4]&#xff1a;将寄存器R0中数据存储到寄存器R1加上偏移量4的位置。MOV r0,#0x01&a…

read()之后操作系统都干了什么

首先说明三个参数 file文件 buff从内存中开辟一段缓冲区用来接收读取的数据 size表示这个缓冲区的大小 有关file的参数&#xff1a; 状态&#xff1a;被打开 被关闭权限&#xff1a;可读可写最重要的是inode: 他包含了 文件的元数据(比如文件大小 文件类型 文件在访问前需要加…

Matlab和python详解数独谜题问题

&#x1f517; 运行环境&#xff1a;Matlab、Python &#x1f6a9; 撰写作者&#xff1a;左手の明天 &#x1f947; 精选专栏&#xff1a;《python》 &#x1f525; 推荐专栏&#xff1a;《算法研究》 &#x1f510;#### 防伪水印——左手の明天 ####&#x1f510; &#x1f4…

c语言调用free,提示已触发了一个断点。

在用c语言写数据结构的链表的时候&#xff0c;执行也没有什么大错&#xff0c;逻辑也是对的&#xff0c;但是一道free函数会自动触发一个断点。如图&#xff1a; 这个断点产生的原因是由于分配的内存太小了在使用的时候没有任何问题&#xff0c;但是在执行程序的时候&#xff0…

JAVA毕业设计113—基于Java+Springboot+Vue的体育馆预约系统(源代码+数据库+12000字论文)

基于JavaSpringbootVue的体育馆预约系统(源代码数据库12000字论文)113 一、系统介绍 本项目前后端分离&#xff0c;本系统分为管理员、用户两种角色 用户角色包含以下功能&#xff1a; 注册、登录、场地(查看/预订/收藏/退订)、在线论坛、公告查看、我的预订管理、我的收藏…

[二分查找]LeetCode2040:两个有序数组的第 K 小乘积

本文涉及的基础知识点 二分查找算法合集 题目 给你两个 从小到大排好序 且下标从 0 开始的整数数组 nums1 和 nums2 以及一个整数 k &#xff0c;请你返回第 k &#xff08;从 1 开始编号&#xff09;小的 nums1[i] * nums2[j] 的乘积&#xff0c;其中 0 < i < nums1.…

45 - 多线程性能优化常见问题

1、使用系统命令查看上下文切换 上下文切换常见的监测工具 1.1、Linux 命令行工具之 vmstat 命令 vmstat 是一款指定采样周期和次数的功能性监测工具&#xff0c;我们可以使用它监控进程上下文切换的情况。 vmstat 1 3 命令行代表每秒收集一次性能指标&#xff0c;总共获取 …

代码随想录算法训练营 ---第五十三天

第一题&#xff1a; 简介&#xff1a; 本题和昨天的最大重复子串问题很相似&#xff0c;只不过本题不一定是连续的。 动规五部曲分析如下&#xff1a; 确定dp数组&#xff08;dp table&#xff09;以及下标的含义 dp[i][j]&#xff1a;长度为i-1 的字符串text1与长度为j-1的…

智能优化算法应用:基于供需算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于供需算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于供需算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.供需算法4.实验参数设定5.算法结果6.参考文献7.MATLAB…

YoloV8改进策略:Swift Parameter-free Attention,无参注意力机制,超分模型的完美迁移

摘要 https://arxiv.org/pdf/2311.12770.pdf https://github.com/hongyuanyu/SPAN SPAN是一种超分网络模型。SPAN模型通过使用参数自由的注意力机制来提高SISR的性能。这种注意力机制能够增强重要信息并减少冗余,从而在图像超分辨率过程中提高图像质量。 具体来说,SPAN模…

Java三种代理模式:静态代理、动态代理和CGLIB代理

Java三种代理模式&#xff1a;静态代理、动态代理和CGLIB代理 代理模式 代理模式是23种设计模式种的一种。代理模式是一种结构型设计模式&#xff0c;它允许为其他对象提供一个替代品或占位符&#xff0c;以控制对这个对象的访问。代理模式可以在不修改被代理对象的基础上&am…

JavaScript基础知识20——循环结构:退出循环

哈喽&#xff0c;大家好&#xff0c;我是雷工&#xff01; 最近一段时间没学习JavaScript&#xff0c;今天看数字孪生的资料&#xff0c;发现很多低代码开发还是得必须熟悉JavaScript才行&#xff0c;为了以后方便搞数字孪生&#xff0c;有时间还是继续学习下JavaScript。 以下…

矩阵元素求和:按行、按列、所有元素np.einsum()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 矩阵元素求和&#xff1a; 按行、按列、所有元素 np.einsum() [太阳]选择题 下列说法正确的是&#xff1a; import numpy as np A np.array([[1, 2],[3, 4]]) print("【显示】A") p…

HR看好的字符函数和字符串处理函数!!!

本篇会加入个人的所谓‘鱼式疯言’❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言,而是理解过并总结出来通俗易懂的大白话,我会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的&#xff0c;可能说的不是那么严谨.但小编初心是能让更多人能接受我们这个概念 前言 在本篇…

【Google2023】利用TiDE进行长期预测实战(时间序列密集编码器)

一、本文介绍 大家好&#xff0c;最近在搞论文所以在研究各种论文的思想&#xff0c;这篇文章给大家带来的是TiDE模型由Goggle在2023.8年发布&#xff0c;其主要的核心思想是&#xff1a;基于多层感知机&#xff08;MLP&#xff09;构建的编码器-解码器架构&#xff0c;核心创…

【设计模式-4.3】行为型——责任链模式

说明&#xff1a;本文介绍设计模式中行为型设计模式中的&#xff0c;责任链模式&#xff1b; 审批流程 责任链模式属于行为型设计模式&#xff0c;关注于对象的行为。责任链模式非常典型的案例&#xff0c;就是审批流程的实现。如一个报销单的审批流程&#xff0c;根据报销单…

44 - 几款常用的性能测试工具

熟练掌握一款性能测试工具&#xff0c;是我们必备的一项技能。他不仅可以帮助我们模拟测试场景&#xff08;包括并发、复杂的组合场景&#xff09;&#xff0c;还能将测试结果转化成数据或图形&#xff0c;帮助我们更直观地了解系统性能。 1、常用的性能测试工具 常用的性能测…