新闻详情

新闻详情

首页 / 资讯中心 / 详情

C++中的构造函数详解

发布时间:2026/9/12 15:36:30来源:尧图网络
C++中的构造函数详解
普通变量的初始化当我们在定义一个变量不给它指定一个初始值时这对于全局变量和局部变量来说结果会不一样。全局变量在程序装入内存时 就已经分配好空间程序运行期间其地址不变它会被初始化为全0变量的每一位都为0。但是局部变量定义在函数内部存储在栈上当函数被调用时栈会分配一部分空间来存储该局部变量也就是只分配空间而不管赋值这时此空间的值是已经有的它是一个随机的值如果程序员不对它进行初始化将会产生不好的后果如果将栈空间内存的变量初始化工作交给编译器则每次函数调用都会被重新赋值则会大大增加开销。示例全局变量这些对象会被赋一个默认的初始值。如图构造函数对象和我们前面提到的基本类型的变量一样定义的时候也能够被初始化。而这些初始化操作会比基本数据类型初始化更复杂一些不仅涉及对类内基本数据类型的初始化还包括进行动态内存分配打开文件等操作。这时就需要为类设计一个构造函数来专门负责这些操作对象一旦创建就立即调用它对其进行强制初始化这是强制执行的。构造函数属于成员函数比较特殊的一种与其他成员函数不同它不能被显式的调用所以也没有必要为它设置返回值它在对象的初始化时起作用设计类时往往将初始化功能在构造函数中实现我们希望创建出的所有变量都能被赋予有意义的能力而不是未知的可以在创建之后再次改变他但在此之前若要使用它将会发生意外所以在制度上我们就要对其进行严防死守使其被创建后一定处于良好状态。构造函数可以重载可以编写多个构造函数参数列表不同。生成对象时将会根据参数列表的参数信息决定该调用哪个构造函数。如果没有对参数有任何交代编译器就认为应该调用无参构造函数。当在局部空间或全局区创建自定义类型的对象时构造函数会被自动调用设计好初始化后每当创建对象就会自动调用构造函数会使每一个对象都处于良好的随时可用的状态。如图以上演示是在类的外部对构造函数进行了定义实际开发中一般将类的定义部分放到头文件中.h而类内成员函数的实现放到实现文件中.cc中。这对我们在不改变类的定义的情况下修改他的成员函数提供了方便。这比在类内直接实现有一个好处就是不需要每次改变函数体都要重新编译前题是不改变函数声明。明确一点如果在类内对成员函数进行了实现它将会被隐式地声明为内联函数由编译器决定是否最终把它变为内联函数。一般超过5行代码的函数就没有必要设为内联函数了函数内限制在两个表达式最好。在我们只定义了有参的构造函数后就不会有无参的构造函数了需要我们自己定义一个无参的构造函数。1234567891011121314classMyArray{chararray_;public:MyArray(chara_new_arrayx):array_(a_new_array);//给出默认参数MyArray();voidPrintMyArray();};//类实现省略voidtest(){MyArray a_long_array(c);//调用有参的构造方法MyArray a_short_array();//调用无参的构造方法}初始化方法一般给出形参列表在这里对类内成员赋初值此时构造函数的函数体还未开始执行我们这里是对其输入了一个字符。构造函数还可以调用其他类的构造函数来初始化对象中的成员变量这是编译器自动调用的如在隐式的数据类型转换时。当然也可以在构造函数函数体内为成员变量赋值这并不是初始化执行函数体后赋值之前成员变量已经有一个无意义的值了。12345MyArray::MyArray(charinit_array){//进入构造函数体后成员变量已经有值了array_init_array;//在函数体内进行赋值cout MyArray的构造方法执行了\n;}形参列表具有立即性在成员变量被创建时形参列表的值就立即为其初始化而构造函数体内需要执行赋值语句。对于一些自定义类型的成员变量进行初始化形参列表初始化往往比赋值语句效率更高。此外对于一些特殊的成员只能采用形参列表的方式进行初始化。一定会生成默认构造函数吗前面我们说过当我们没有编写构造函数时编译器会为我们生成一个默认的构造函数对于初学者来说这就够了但现在我们要强调几点。1.如果类中我们没有定义构造函数并且类中成员变量含有自定义类型成员变量时编译器会生成默认构造函数并且调用自定义类型的构造函数。2.当父类具有默认构造函数而子类没有任何构造函数当生成子类对象时会生成子类的默认构造函数在这个函数中调用父类默认构造函数。3.当一个含有虚函数并且没有构造函数时编译器会生成默认的构造函数。4.出现菱形继承时两个父类分别进行虚继承当出现子类对象时子类会生成一个自己的默认构造函数在构造函数内调用两个父类的构造函数。5.在定义类时直接为成员变量赋值当生成对象时会调用默认构造函数。防止隐式类型转换如果构造函数只有一个参数的话最好将此构造函数声明为ecplicit,他能防止编译器将explicit的构造函数进行隐式类型转换。12345678910111213141516171819classMyArray{chararray_;doublearray_length_;public:MyArray(doubleinit);MyArray(charinit);voidPrintMyArray(MyArray a_array);};voidMyArray::PrintMyArray(MyArray a_array){//理应接受一个对象有时会接受一个基本类型//此时会进行隐式类型转换cout MyArray为 a_array.array_length_ \n;}voidtest(){MyArray first_array(3.0);first_array.PrintMyArray(5.0);//隐式的将5.0转化为了MyArray对象}修改如下123456789classMyArray{chararray_;doublearray_length_;public:explicitMyArray(doubleinit);explicitMyArray(charinit);voidPrintMyArray(MyArray a_array);};此时调用first_array.PrintMyArray(5.0)就会报错了。赋值与初始化的区别必须明确初始化和赋值的概念当一个对象刚被创建时对它的赋值操作为初始化而赋值是修改一个已经存在并且有值的对象。12inta_int1;//初始化,a_int被创建出来并被立即初始化a_int2;//赋值a_int已经存在没有新的变量被创建出来初始化出现在构造函数中而赋值出现在operator操作符中。一个对象只能被初始化一次而赋值却可以不限制次数在对象的声明期内都可以进行。而且进行赋值时可能会进行类型转换此时会产生临时对象。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

十字型声子晶体:原理、模拟与应用全解析 2026/9/12 17:00:46

十字型声子晶体:原理、模拟与应用全解析

1. 十字型声子晶体概述十字型声子晶体是一种特殊的人工周期结构材料,通过精心设计的几何排列实现对弹性波或声波的调控。这种结构因其独特的十字交叉形状而得名,在声学超材料领域具有重要研究价值。与传统的均匀材料不同,声子晶体的周期性结构…

阅读更多 →
redis-py 热升级指南:用多数据库故障转移实现 Redis 模块零停机升级 2026/9/12 17:00:46

redis-py 热升级指南:用多数据库故障转移实现 Redis 模块零停机升级

redis-py 热升级指南:用多数据库故障转移实现 Redis 模块零停机升级 【免费下载链接】redis-py Redis Python client 项目地址: https://gitcode.com/GitHub_Trending/re/redis-py 给 Redis 换装一个新模块,往往要重启进程才能加载,业…

阅读更多 →
多模态视觉大模型开发实战:从数据工程到微调部署全解析 2026/9/12 17:00:46

多模态视觉大模型开发实战:从数据工程到微调部署全解析

最近两年,多模态这个方向几乎成了大模型领域最热闹的战场。从CLIP打开图文对齐的思路,到LLaVA验证视觉指令微调的可行性,再到Qwen-VL、InternVL这些开源模型把效果卷到接近闭源水平,整个技术栈已经非常完整。到了2026年&#xff0…

阅读更多 →
go2rtc:低延迟摄像头串流的完整方案 2026/9/12 17:00:46

go2rtc:低延迟摄像头串流的完整方案

go2rtc:低延迟摄像头串流的完整方案 【免费下载链接】go2rtc Ultimate camera streaming application 项目地址: https://gitcode.com/GitHub_Trending/go/go2rtc 手机上看摄像头直播,画面总比现场慢 3 秒?那是协议自带的延迟。go2rtc…

阅读更多 →
asdf 常见问题深度解析:WSL 支持、Shim 失效排查与 .tool-versions 版本约束全指南 2026/9/12 17:00:46

asdf 常见问题深度解析:WSL 支持、Shim 失效排查与 .tool-versions 版本约束全指南

asdf 常见问题深度解析:WSL 支持、Shim 失效排查与 .tool-versions 版本约束全指南 【免费下载链接】asdf Extendable version manager with support for Ruby, Node.js, Elixir, Erlang & more 项目地址: https://gitcode.com/GitHub_Trending/as/asdf …

阅读更多 →
STM32驱动SSD1306 OLED显示60s倒计时:SPI、定时器与显存寻址实践 2026/9/12 16:57:45

STM32驱动SSD1306 OLED显示60s倒计时:SPI、定时器与显存寻址实践

简介:一份基于STM32微控制器实现60秒倒计时显示任务的完整工程与源码包,面向嵌入式初学者、单片机开发人员及电子竞赛备赛者。工程覆盖显示屏驱动、定时器计数、中断服务程序和GPIO引脚配置等核心知识点,涉及LCD、OLED等常见显示设备与SPI、I…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞