C++——构造函数

news2024/11/24 11:44:33

定义

构造函数是一个特殊的成员函数,名字和类名相同,创建类类型对象时由编译器自动调节,保证每个数据成员都有一个合适的初始值,并且在对象的声明周期内只调用一次。

特性

1.函数名和类名相同

2.无返回值

3.对象实例化时编译器自动调用对应的构造函数

4.构造函数可以重载(本质就是,我们可以写多个构造函数,提供多种初始化方式)

class Date

{

public:

         Date()                                                //无参构造函数

                {

                            _year = 1;

                            _month = 1;

                            _day = 1;

                }

        Date(int year, int month, int day)        //有参构造函数

                {

                        _year = year;

                        _month = month;

                        _day = day;

                }

private:

                int _year;

                int _month;

                int _day;

};

void TestDate()

        {

                Date d1;                       //定义一个Date对象的时候自动调用无参构造函数

                Date d2(2007,7,20);    //自动调用有参的构造函数(有参函数调用时,参数写在对象后面,而不是函数的后面)

           

              Date d3();                //因为编译器分不清这是在定义新的函数还是在调用函数,所以会报错,不可以这样写!    

        }

全缺省参数

1.全缺省参数和无参的构造函数、我们没写编译器默认生成的都称为默认构造函数(我们不写,编译器会自动生成),并且默认构造函数只能有一个。注意:无参构造函数、全缺省构造函数、我们没写编译器默认生成的构造函数,都可以认为是默认成员函数。

//默认构造函数

class Date

{

public:

         Date()                                                

                {

                            _year = 1;

                            _month = 1;

                            _day = 1;

                }

        Date(int year = 1, int month = 1, int day = 1)      

                {

                        _year = year;

                        _month = month;

                        _day = day;

                }

private:

                int _year;

                int _month;

                int _day;

};

void TestDate()

        {

               Date d1;//调用产生歧义

        }

所以全缺省函数和无参构造函数在语法上可以同时存在,但是调用时会产生歧义,这时我们会选择保留全缺省函数(灵活:想传几个参数就传几个参数,不传参时可视为无参构造函数,全传时可视为有参构造函数)

2.缺省参数可以避免栈的扩容

我们知道realloc扩容,有可能是原地扩容,也有可能是异地扩容。而异地扩容的代价也是比较大的。不光要找一个更大的空间,还要把原来的数据进行拷贝。所以缺省参数对栈来说还是很好用的。

Stack(size_t n = 4)//栈的无参构造函数改造
    {
        if (n == 0)
        {
            capacity = top = 0;
            a = nullptr;
        }
        else
        {
            a = (int*)malloc(sizeof(int) * n);
            if (a == NULL)
            {
                perror("malloc fail::");
                return;
            }
            capacity = n;
            top = 0;
        }
    }

默认构造函数

编译器生成的默认构造函数的特点:

1.我们不写才会生成一个无参的构造函数,我们写了任意一个构造函数,无参构造函数就不会生成了。(所以写了有参构造函数之后,也要写上无参构造函数)

写了这一个半缺省的函数,那么该类的无参构造函数就算你没写,也不会自动生成了。除非你一个构造函数都没写。

2.内置类型的成员不会处理  

3.自定义类型的成员才会处理,会去调用这个成员的构造函数

总结:一般情况下,都需要我们自己写构造函数,决定初始化的方式。除非,这个类的成员变量全是自定义类型。

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

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

相关文章

自动化测试工具slelnium的初体验

1.slelnium介绍 1.1 一个Web的自动化测试工具,最初是为网站自动化测试而开发的。 1.2 可以直接运行在浏览器上,它支持所有主流的浏览器(包括PhantomJS这些无界面的浏览器),可以接收指令,让浏览器自动加载页…

锐捷交换机vlan隔离(wifi段仅能访问外网,和内网隔离)

因为公司的wifi段,未做隔离,无意间上了网,发现能访问内网网段,这里内网是10、20段,管理网段是100段,于是做了和内网的vlan隔离。 拓朴如下,所有vlan的网关都起在核心上,核心上起了DH…

23062QTday2

完善登录框 点击登录按钮后,判断账号(admin)和密码(123456)是否一致,如果匹配失败,则弹出错误对话框,文本内容“账号密码不匹配,是否重新登录”,给定两个按钮…

华为数通方向HCIP-DataCom H12-831题库(单选题:41-60)

第41题 除了虚连接之外,OSPFV3的Hello报文源IPv6地址是哪种类型的IPv6地址? A、IPv6任播地址 B、唯一本地地址 C、全球单播地址 D、链路本地地址 答案: D 解析: 这里题目是源IPv6,不是目的IPv6,与另一题类似 第42题 下列描述中关于MPLS网络中配置静态LSP正确的是? A、…

three.js——模型对象的使用材质和方法

模型对象的使用材质和方法 前言效果图1、旋转、缩放、平移,居中的使用1.1 旋转rotation(.rotateX()、.rotateY()、.rotateZ())1.2缩放.scale()1.3平移.translate()1.4居中.center() 2、材质属性.wireframe 前言 BufferGeometry通过.scale()、…

uniapp h5网页打开白屏

修改了默认基本运行路径,然后直接打开index.html的情况下是会这样,放在nginx服务器上运行就ok了。 把默认的./ 路径修改了:/cloudh5 nginx html目录下放子网站 :/cloudh5:

【深度学习实验】线性模型(二):使用NumPy实现线性模型:梯度下降法

目录 一、实验介绍 二、实验环境 1. 配置虚拟环境 2. 库版本介绍 三、实验内容 0. 导入库 1. 初始化参数 2. 线性模型 linear_model 3. 损失函数loss_function 4. 梯度计算函数compute_gradients 5. 梯度下降函数gradient_descent 6. 调用函数 一、实验介绍 使用Nu…

Lombok依赖

一.介绍 Project Lombok 是一个 Java 库,它会自动插入编辑器和构建工具,为您的 Java 增添趣味。永远不要再写另一个 getter 或 equals 方法,使用一个注释,您的类有一个功能齐全的构建器,自动化您的日志记录变量等等。…

2023陇剑杯

2023陇剑杯初赛WP HW hard_web_1 ​ 首先判断哪个是服务器地址 ​ 从响应包看,给客户端返回数据包的就是服务器 所以确定服务器地址是192.168.162.188​ 再从开放端口来看,长期开放的端口 客户端发送一个TCP SYN包(同步请求&#xff…

VisualBox QA

出现提示注册表错误,或者之前正常,重启VisualBox后,VM运行失败时,可通过正确卸载VisualBox,然后使用注册表清理软件(CCleaner)清理注册表后,重装VisualBox,即会正常。(一般用这个能解…

CSS Id和Class选择器

文章目录 CSS id 选择器示例 CSS class 选择器CSS id和class的区别和相同点 CSS id 选择器 CSS的id选择器是以“#”开头的,用于选择具有特定id属性的HTML元素。 在HTML文档中,每个id应该是全局唯一的,也就是说,每个id只能用于一…

复杂场景:揭秘新生代光伏独角兽企业的数据管理秘诀

项目背景 最新一个光伏独角兽诞生了。 投资界获悉,一道新能源科技股份有限公司(以下简称“一道新能”)完成Pre-IPO融资。经多家投资方核实,此轮投后估值近80亿元。 一道新能源科技股份有限公司,成立于2018年8月&…

就业创业证查询

这里写目录标题 问题描述结果 问题描述 全国就业创业证查询系统自改版本后不支持根据姓名身份证号查询了,从社保局查又需要证书编号。 结果 经过不谢努力找到了解决办法,可以根据身份证姓名批量查询人员是否有就业证。

【Flowable】使用UEL整合Springboot从0到1(四)

前言 在前面我们介绍了Springboot简单使用了foleable以及flowableUI的安装和使用,在之前我们分配任务的处理人的时候都是通过Assignee去指定固定的人的。这在实际业务中是不合适的,我们希望在流程中动态的去解析每个节点的处理人,当前flowab…

家里电脑怎样远程办公室电脑?快解析映射域名实现内网穿透

远程电脑怎么操作是大家比较关注的问题,特别是涉及内外网,不在同一个局域网内不同计算机间的远程连接访问,如家里电脑怎样远程办公室电脑?这里提供一种简便的异地远程方法:用快解析。通过快解析映射域名软件&#xff0…

【漏洞复现】Smanga未授权远程代码执行漏洞(CVE-2023-36076) 附加SQL注入+任意文件读取

文章目录 前言声明一、产品简介一、漏洞描述二、漏洞等级三、影响范围四、漏洞复现五、修复建议六、附加漏洞漏洞一、SQL注入漏洞二、任意文件读取 前言 Smanga存在未授权远程代码执行漏洞,攻击者可在目标主机执行任意命令,获取服务器权限。 声明 请勿利用文章内的相关技术从…

【面试题】——Java基础篇(33题)

文章目录 1. 八大基本数据类型分类2. 重写和重载的区别3. int和integer区别4. Java的关键字5. 什么是自动装箱和拆箱?6. 什么是Java的多态性?7. 接口和抽象类的区别?8. Java中如何处理异常?9. Java中的final关键字有什么作用&…

Java文字描边效果实现

效果: FontUtil工具类的完整代码如下: 其中实现描边效果的函数为:generateAdaptiveStrokeFontImage() package com.ncarzone.data.contentcenter.biz.img.util;import org.springframework.core.io.ClassPathResource; import org.springfr…

爱思唯尔——利用AI来改善医疗决策和科研

爱思唯尔(Elsevier)是一家全球性的多媒体出版公司,为教育、专业科学和医疗社区提供20,000多种产品,其中包括《柳叶刀》和《细胞》等领先的研究出版物。 该公司正处于数字化转型的第一阶段,将公司140年中发表在报告和期刊上的大量数据数字化。…

小米华为,化干戈为玉帛!

近日来,手机圈又掀起了各大厂家推出新品的高潮。首先是华为Mate60的推出,其自研的麒麟9000S芯片瞬间点燃了国内手机市场,得到了国内甚至国外业界人士的认可和好评。 而近日网上盛传的小米创始人雷军的“愿意加入华为技术生态圈”的邀请&…