C++ 类和对象 构造函数

一 类的6个默认成员函数:

如果一个类中什么成员都没有,简称为空类。

例:

#include <iostream>
class Empty 
{
    // 空类,什么成员都没有
};

空类中真的什么都没有吗?并不是,任何类在什么都不写时,编译器会自动生成以下6个默认成员 函数。

默认构造函数:如果用户没有定义任何构造函数,编译器会自动生成一个默认构造函数。

拷贝构造函数:用于创建一个对象是另一个对象的副本。如果用户没有定义,编译器会生成一个默认的拷贝构造函数。

拷贝赋值运算符:用于将一个对象赋值给另一个对象。如果用户没有定义,编译器会生成一个默认的拷贝赋值运算符。

移动构造函数:用于将资源从一个对象移动到另一个对象。如果用户没有定义,编译器会生成一个默认的移动构造函数。

移动赋值运算符:用于将资源从一个对象移动并赋值给另一个对象。如果用户没有定义,编译器会生成一个默认的移动赋值运算符。

析构函数:用于销毁对象并释放资源。如果用户没有定义,编译器会生成一个默认的析构函数。

默认成员函数:用户没有显式实现,编译器会生成的成员函数称为默认成员函数。

二 构造函数:

2.1:构造函数的概念:

构造函数是一个特殊的成员函数,它的名称与类名相同,没有返回值。在创建类的对象时,构造函数由编译器自动调用,用于初始化对象的数据成员

2.2:构造函数的特征

函数名与类名相同。

没有返回值。

在对象实例化时由编译器自动调用。

构造函数可以重载,即一个类可以有多个构造函数,只要它们的参数列表不同。

2.3:无参/有参构造函数代码示例

class Date
{
public:
    //有参数的构造函数:
    //Date(int _year = 1999 , int _month = 2 , int _day = 26)
    
    // 无参构造函数:
    Date() //函数名与类名相同。
    
    {
        // 使用 this 指针访问成员变量
        this->_year = 2024;
        this->_month = 7;
        this->_day = 6;
    }

    void Print()
    {
        std::cout << this->_year << "-" << this->_month << "-" << this->_day << std::endl;
    }

private:
    int _year;
    int _month;
    int _day;
};

int main()
{
    Date d1; //调用无参数构造函数 
    d1.Print();

    //Date d2(2022, 7, 6); //调用带参构造函数
    //d2.Print();
    return 0;
}

Date()是无参的构造函数,没有参数。在对象 d1 创建时自动调用。你们有可能会问了,为什么在无参的构造函数里面this指针指向成员变量,那为什么main函数里见不到this指针呢?因为当 Date d1; 创建对象时,编译器会自动传递 d1 的地址给 this 指针所以就不需要显示this指针。

如果类中没有显式定义构造函数,编译器会自动生成一个无参的默认构造函数。一旦用户显式定义了任何构造函数,编译器将不再生成无参的默认构造函数。

2.4:默认构造函数代码示例

class Date 
{
public:
    void Print() 
    {
        std::cout << _year << "-" << _month << "-" << _day << std::endl;
    }

private:
    int _year;
    int _month;
    int _day;
};

int main() 
{
     Date d1;
    d1.Print();
    return 0;
}

输出:

上面代码因我未显示定义构造函数所以编译器帮我生成了一个默认的构造函数而且是看不见的,那为什么默认生成的输出的值是随机值呢?

原来C++把类型分为内置类型和自定义类型,内置类型就是语言提供的基本数据类型,如intchar等。自定义类型是用户定义的类型,如使用classstructunion定义的类型。

2.5:内置类型和自定义类型的默认构造函数处理

内置类型:

   1.内置类型的成员变量在默认构造函数中不会被自动初始化

   2.如果不显式初始化,成员变量的值将是未定义的(即随机值)

自定义类型:

   1.自定义类型的成员变量在默认构造函数中会调用其默认构造函数。

   这意味着,即使你没有显式定义自定义类型的构造函数,编译器也会自动调用默认构造函数来       初始化这些成员变量。

例子:

class Time 
{
public:
    Time() 
    {
         // Time类的无参构造函数
        std::cout << "Time()" << std::endl;
        _hour = 0;
        _minute = 0;
        _second = 0;
    }

private:
    int _hour;
    int _minute;
    int _second;
};

class Date 
{
public:
    Date()// 初始化内置类型成员变量
    {
        this->_year = 2024;
        this->_month = 7;
        this->_day = 5;
    }

    void Print()
    {
        std::cout << _year << "-" << _month << "-" << _day << std::endl;
    }

private:
    int _year;  // 内置类型
    int _month; // 内置类型
    int _day;   // 内置类型
    Time _t;    // 自定义类型
};

int main() 
{
    Date d;  // 调用无参构造函数
    d.Print();
    return 0;
}

输出:

我们来说一下它的执行顺序:首先是执行主函数main当执行到 Date d; 时编译器就会先去调用自定义函数Time_t;然后等它全部初始化完成 再去调用无参数构造并且初始化里面的内置类型。

那我们这是显式定义自定义类型的构造函数并且给成员变量赋值了,所以就不会出现随机值,如果想要显式定义自定义类型的构造函数并且不想要随机值那该怎么办呢?这时候C++11 中针对内置类型成员不初始化的缺陷,又打了补丁,即:内置类型成员变量在类中声明时可以给默认值。

例子:

class Date 
{
public:
    void Print()
    {
        std::cout << _year << "-" << _month << "-" << _day << std::endl;
    }

private:
    int _year = 2024;  // 内置类型
    int _month = 2; // 内置类型
    int _day = 1;   // 内置类型
};

输出:

2.6:默认构造函数

在C++中,默认构造函数是指在创建对象时不需要提供任何参数的构造函数。默认构造函数可以分为两种:

  1. 默认构造函数:一个类只能有一个真正的默认构造函数(不需要参数)。
  2. 无参构造函数和全缺省参数构造函数
    • 如果参数不同,它们会重载,编译器不会报错。
    • 如果参数相同(即都没有参数),它们就相当于有两个默认构造函数,这时编译器会报错,因为无法区分调用哪个构造函数。

关键点

无参构造函数:没有参数的构造函数。 全缺省参数构造函数:所有参数都有默认值的构造函数。 重载:当构造函数的参数列表不同,它们可以共存且不会冲突。

 

例子:

class Date 
{
public:
    // 无参构造函数
    Date() 
    {
        _year = 2024;
        _month = 7;
        _day = 2;
    }

    // 全缺省参数构造函数
    Date(int year = 2023, int month = 1, int day = 1) 
    {
        _year = year;
        _month = month;
        _day = day;
    }

    void Print()
    {
        std::cout << _year << "-" << _month << "-" << _day << std::endl;
    }

private:
    int _year;
    int _month;
    int _day;
};

int main() 
{
    Date d;  // 调用无参构造函数
    d.Print();

    Date d2(2023, 4, 3);  // 调用全缺省参数构造函数
    d2.Print(); 
    return 0;
}

输出:

之所以会报错是因为全缺省参数构造函数和无参数构造函数它们都有自己的默认值,当执行到Date d; 时它并不知道到底要调用哪一个所以就会报错,那怎么更改呢?只需要把全缺省参数的默认值给去掉就行了,这样编译器就不会迷糊到底要调用哪一个了

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

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

相关文章

ONNX Runtime入门示例:在C#中使用ResNet50v2进行图像识别

ONNX Runtime简介 ONNX Runtime 是一个跨平台的推理和训练机器学习加速器。ONNX 运行时推理可以实现更快的客户体验和更低的成本&#xff0c;支持来自深度学习框架&#xff08;如 PyTorch 和 TensorFlow/Keras&#xff09;以及经典机器学习库&#xff08;如 scikit-learn、Lig…

文件打开的系统错误分析流程

当用户出现“Open file failed”错误时&#xff0c;手动产生dump文件。 &#xff08;1&#xff09;打开资源管理器&#xff0c;选择AppNameXXX.exe进程&#xff0c;右击鼠标选择“创建转储文件” (2) 生成转储文件 3.获取用户转储文件 4.用Visual studio2015打开dump文件分析…

深入讲解C++基础知识(二)

目录 一、复合类型1.引用1.1 引用的定义和使用1.2 引用的注意事项 2. 指针2.1 指针的定义和使用2.2 指针的四种状态2.3 指针的注意事项2.4 其他指针操作2.5 void* 指针 3. 理解复合类型变量的声明4. const 限定符4.1 const 对象的注意事项4.2 const 和引用4.2.1 术语&#xff1…

绘唐科技聚星文社是同款一键生成工具

聚星文社是同款一键生成工具 工具下载 绘唐科技成立于2015年&#xff0c;是一家专注于虚拟现实&#xff08;VR&#xff09;技术和产品开发的高科技企业。绘唐科技的目标是利用虚拟现实技术为人们带来更加沉浸式的体验&#xff0c;推动虚拟现实在各个领域的应用和发展。 绘唐科…

【FFmpeg】avcodec_send_frame函数

目录 1.avcodec_send_frame1.1 将输入的frame存入内部buffer&#xff08;encode_send_frame_internal&#xff09;1.1.1 frame的引用函数&#xff08;av_frame_ref &#xff09;1.1.1.1 帧属性的拷贝&#xff08;frame_copy_props&#xff09;1.1.1.2 buffer的引用函数&#xf…

学会python——用python制作一个绘图板(python实例十九)

目录 1.认识Python 2.环境与工具 2.1 python环境 2.2 Visual Studio Code编译 3.制作一个绘图板 3.1 代码构思 3.2 代码实例 3.3 运行结果 4.总结 1.认识Python Python 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。 Python 的设计具有很强的可…

Node.js实现一个文章生成器

前言 本文将从零开始&#xff0c;讲解如何使用Node.js来实现一个文章生成器 node里面有很多优秀的模块&#xff0c;现在我们就借助node的fs模块来操控文本&#xff0c;来实现我们想要的效果 效果展示 体验 fs 首先我们先创建一个json文件 里面放一些内容 接下来我们书写代码…

【博士每天一篇文献-算法】Adult neurogenesis acts as a neural regularizer

阅读时间&#xff1a;2023-12-20 1 介绍 年份&#xff1a;2022 作者&#xff1a;Lina M. Tran&#xff0c;Adam Santoro&#xff0c;谷歌DeepMind 期刊&#xff1a; Proceedings of the National Academy of Sciences 引用量&#xff1a;13 代码&#xff1a;https://github.c…

Java后端每日面试题(day1)

目录 JavaWeb三大组件依赖注入的方式Autowire和Resurce有什么区别&#xff1f;Spring Boot的优点Spring IoC是什么&#xff1f;说说Spring Aop的优点Component和Bean的区别自定义注解时使用的RetentionPolicy枚举类有哪些值&#xff1f;如何理解Spring的SPI机制&#xff1f;Spr…

2024年【四川省安全员B证】考试及四川省安全员B证考试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年【四川省安全员B证】考试及四川省安全员B证考试题&#xff0c;包含四川省安全员B证考试答案和解析及四川省安全员B证考试题练习。安全生产模拟考试一点通结合国家四川省安全员B证考试最新大纲及四川省安全员B证…

第一篇——导论:数学通识课的体系和学习攻略

目录 一、背景介绍二、思路&方案三、过程1.思维导图2.文章中经典的句子理解3.学习之后对于投资市场的理解4.通过这篇文章结合我知道的东西我能想到什么&#xff1f; 四、总结五、升华 一、背景介绍 数学的认知大厦&#xff1b;之前听的时候就觉得很重要&#xff0c;本次又…

Google Earth Engine(GEE)——控制台ui.Textbox复制你想要的textbox

结果 函数: ui.Textbox(placeholder, value, onChange, disabled, style) A textbox that enables the user to input text information. Arguments: placeholder (String, optional): The placeholder text to display when the textbox is empty. Defaults to none. …

鸿蒙开发设备管理:【@ohos.account.appAccount (应用帐号管理)】

应用帐号管理 说明&#xff1a; 本模块首批接口从API version 7开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。开发前请熟悉鸿蒙开发指导文档&#xff1a;gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md点击或者复制转到。 导入模…

Linux中配置sudo用户访问权限

一、如何在 Linux 中配置 sudo 的访问权限 1.1、给用户dhz普通用户增加 sudo 权限 [rootlocalhost ~]# id dhz uid1000(dhz) gid1000(dhz) 组1000(dhz),10(wheel)1.2、使用root用户编辑/etc/sudoers文件 [rootlocalhost ~]# vi /etc/sudoers-- 增加&#xff1a; dhz ALL(ALL…

2024/07/05

1、梳理笔记 2、课堂习题 1、循环输入一个5位数&#xff0c;判断它是不是回文数。当输入0时循环结束。 即12321是回文数&#xff0c;个位与万位相同&#xff0c;十位与千位相同。 #include<stdio.h> int main(int argc, char const *argv[]) {while(1){int num0;printf(…

贪吃蛇——C语言(VS2022含源代码,及源代码zip文件)

一.游戏背景 贪吃蛇是一款在世界上盛名已久的小游戏&#xff0c;贪食蛇游戏操作简单&#xff0c;可玩性比较高。这个游戏难度最大的不是蛇长得很长的时候&#xff0c;而是开始。那个时候蛇身很短&#xff0c;看上去难度不大&#xff0c;却最容易死掉&#xff0c;因为把玩一条小…

vscode连接SSH

1、安装Remote-SSH插件 2、点击左下角&#xff0c;选择SSH 3、点击连接到主机后&#xff0c;添加新的SSH主机&#xff0c;示例ssh 用户ip 4、点击服务器&#xff0c;输入密码登录服务器 5、可在远程资源管理器选项卡中查看 6、可以在ssh设置中打开ssh配置文件 config中的文件…

合合信息大模型“加速器”亮相2024世界人工智能大会,助力大模型学好“专业课”

7月4日至7日&#xff0c;2024世界人工智能大会在上海拉开帷幕。现阶段&#xff0c;“百模大战”现象背后的中国大模型发展前景与堵点仍然是各界关注的焦点。如何帮助大模型在信息的海洋中快速找准航向&#xff0c;在数据的荒漠中找到高质量的“水源”&#xff1f;合合信息在本次…

Vue报错:Module not found: Error: Can‘t resolve ‘less-loader‘ in ‘文件地址‘

原因&#xff1a;Webpack无法找到 less-loader 模块&#xff0c;但在<style langless></style>中进行使用。less-loader 是一个Webpack的加载器&#xff0c;它用于将less文件编译成CSS。如果Webpack无法解析这个加载器&#xff0c;它就无法处理less文件&#xff0c…

LeetCode刷题记录:(15)三角形最小路径和

知识点&#xff1a;倒叙的动态规划 题目传送 解法一&#xff1a;二维动态规划【容易理解】 class Solution {public int minimumTotal(List<List<Integer>> triangle) {int n triangle.size();if (n 1) {return triangle.get(0).get(0);}// dp[i][j]:走到第i层第…