当前位置: 首页 > 编程日记 > 正文

C++构造函数(一)

本篇是介绍C++的构造函数的第一篇(共二篇),属于读书笔记,对C++进行一个系统的复习。

构造函数的概念和作用

全局变量未初始化时为0,局部变量未初始化时的值却是无法预测的。这是因为,全局变量的初始化是再程序装载时便一次性完成的,自动地初始化为零并不会有额外的开销,因此编译器默认初始化为零。但是对局部变量并没有这样的操作,需要程序去完成初始化。

基本类型变量的初始化只需要在定义时赋值就可以了,但是对于对象的初始化,情况就要复杂一些。比如,有的对象需要在创建时就令某个指针指向一块内存空间,这就涉及到空间的分配;再比如,有的对象包含文件操作,在创建时就需要打开特定文件。举这两个例子是要说明,对象的初始化,不仅仅是简单赋值那么简单。因此构造函数(constructor)是必要的,它的存在就是为了完成对象的初始化工作。

构造函数名字和类名一样,没有返回值,可以重载。可以有多个构造函数,如果没有就自动生成一个默认的构造函数,但是它什么也不做。

默认构造函数

自动生成的构造函数是一个没有参数的构造函数。但凡自己已经写了一个构造函数,都不会自动生成无参的构造函数。不论是程序员自己写的无参构造函数还是自动生成的无参构造函数,只要是无参构造函数,就称为默认构造函数。那么,考虑下面一种情况:程序员只写了有参的构造函数,这种情况下就不存在默认构造函数。所以默认构造函数不一定存在,或者说无参的构造函数不一定存在。为什么要强调无参的构造函数不一定存在,有没有哪种构造函数一定是存在的呢?复制构造函数是一定存在的,在后文介绍。

对象在生成的时候一定会调用某个构造函数初始化,而对象一旦生成,就再也不会在其上调用构造函数。

构造函数是负责内存的分配吗?不是的,它只负责初始化。所以创建一个对象的过程是,先内存分配(在堆或栈上),之后在分配好的内存上调用构造函数。

构造函数在数组中的使用

像 int a[3] = { 0 ,1 ,2 }; 这样的语句就实现了数组的初始化。如何给一个对象数组初始化呢,可以使用类似的方法。

1 class CNum {
2 
3 int num;
4 public:
5 
6 CNum(){ num = 0;}
7 CNum(int a){ num = a;}
8 CNum(int a, int b){ num = a + b;}
9 }

可以这样调用:

1 CNum n1[3];                   //调用了三次无参构造函数,结果是{0,0,0}
2 CNum n2[3] = {0, 1, 2};           //调用了三次CNum(int a),结果是{0,1,2}
3 CNum n3[3] = {0, 1};             //调用了两次CNum(int a),和一次无参构造函数,结果是{0,1,0}
4 CNum n4[3] = {0, CNum(1,2), CNum(2,3)};  //调用了一次无参构造函数和两次CNum(int a, int b),结果是{0,3,5}

想在堆上生成数组可以这样:

1 CNum * ptrnum[3] = {new CNum(1,2), new CNum(2,3)};

这样生成的实际上是一个指针数组,前两个元素指向的对象使用了CNum(int a, int b)初始化,第三个元素没有初始化,是一个野指针(请避免这样做)。所以这一个语句实际上调用了两次构造函数。

转载于:https://www.cnblogs.com/painterQ/p/7003814.html

相关文章:

CSS之布局(行内元素的盒模型)

行内元素的盒模型&#xff1a; <!DOCTYPE html> <html><head><meta charset"UTF-8"><title>行内元素的盒模型</title><style>.s1{background-color: yellow;/*行内元素的盒模型&#xff1a;-行内元素不支持设置宽度和高度…

es安装的时候遇到的所有的坑

不允许root用户启动。 解决办法&#xff0c;创建子用户。 在linux下需要注意。es默认不能用root用户启动。我们需要新建一个用户来启动。 groupadd es adduser es-user -g 用户组 -p 密码 #新建一个es-user用户 密码可以省略 chown -R es-user:es /usr/local/elk/ …

MD5 - Bump Mapping

使用《mathematics for 3d game programming & computer graphics》中介绍的方法计算tangent basis.需要注意的一点是&#xff0c;在计算tangent basis的时候&#xff0c;最好是采用顶点的法线而非三角形的&#xff0c;否则将会产生非常严重的不平滑过渡。没有开启Bump Map…

『03网络』 实验一:多功能浏览器的使用和个人Blog的创建和使用

实验一&#xff1a;多功能浏览器的使用和个人Blog的创建和使用<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />一、 实验目的1、熟悉各种浏览器的使用和配置&#xff1b;2、创建个人Blog&#xff0c;并加以完善。二、 …

SQL Server 最佳实践分析器使用小结

Best Practices Analyzer Tool for Microsoft SQL Server 2000是Microsoft SQL Server开发团队开发的一个数据库管理工具&#xff0c;可以让你检测设计的数据库是否遵循SQL Server操作和管理的最佳实践准则。这些准则公认有助于提高数据库的性能和效率&#xff0c;并让应用程序…

Vue 框架-02-事件:点击, 双击事件,鼠标移上事件

Vue 框架-02-事件&#xff1a;点击, 双击事件,鼠标移上事件 1.单击事件&#xff1a;v-on:click 源码 app2.js &#xff1a; //实例化 vue 对象 new Vue({//注意代码格式//el&#xff1a;element 需要获取的元素&#xff0c;一定是 html 中的根容器元素el:"#vue-app",…

HTML5 canvas绘制雪花飘落

Canvas是HTML5新增的组件&#xff0c;它就像一块幕布&#xff0c;可以用JavaScript在上面绘制各种图表、动画等。没有Canvas的年代&#xff0c;绘图只能借助Flash插件实现&#xff0c;页面不得不用JavaScript和Flash进行交互。有了Canvas&#xff0c;我们就再也不需要Flash了&a…

CSS之布局(默认样式)

默认样式&#xff1a; <!DOCTYPE html> <html><head><meta charset"UTF-8"><title>默认样式</title><!--重置样式表&#xff1a;专门用来对浏览器的样式进行重置的reset.css 直接去除浏览器的默认样式normalize.css 对默认样…

Junit资料汇集

Junit资料汇集 提交时间: 2004-2-24 17:23:10 回复 发消息 JUnit入門http://www.dotspace.twmail.org/Test/JUnit_Primer.htm怎样使用Junit Framework进行单元测试的编写http://www.chinaunix.net/bbsjh/14/546.htmlAntJunitLog4JCVS进行XP模式开发的建立http://ejb.cn/modu…

LESS 的 operation 是 特性

LESS 的 operation 是 特性&#xff0c;其实简单的讲&#xff0c;就是对数值型的 value&#xff08;数字、颜色、变量等&#xff09;进行加减乘除四则运算。 例&#xff1a; 清单 1 . LESS 文件 12345init: #111111; transition: init*2; .switchColor { color: transition; }经…

测一测你的blog魔症有多严重

测一测你的blog魔症有多严重 在Donews.net那里看到了这个有趣的测试&#xff1a;Are You a Blogaholic? 用来测试你对Blog的迷恋程度。 下面是我的得分与评价&#xff1a;14058 people have taken this silly test so far. 3626 people have scored higher than you. 9297 pe…

CSS之布局(盒子的尺寸)

盒子的尺寸&#xff1a; <!DOCTYPE html> <html><head><meta charset"UTF-8"><title>盒子的尺寸</title><style>.box1{width: 100px;height: 100px;background-color: #BBFFAA;padding: 10px;border: 10px solid red;/*默…

自己写的一个测试函数执行效率的单元(test on Delphi 7)

运用了一点技巧来实现对函数进行效率测试使用方法:uses Profile;.......function TForm1.Func1():string;begin TFunctionTimeProfiler.ExecuteTest(ClassName, Func1); //这里会创建一个接口实例,并开始测试; 此实例会自动释放并结束测试 ....end;程序最后退出会自动生…

datatable自动增加序号

{"targets": [0],"visible": true,"render": function (data, type, full, meta) {var id full.id;if (id) {return meta.row 1 meta.settings._iDisplayStart;} else {return ;}} },此方法有点小bug,推荐用下面的方法。 var table $(#myTabl…

CSS之布局(轮廓和圆角)

轮廓和圆角&#xff1a; <!DOCTYPE html> <html><head><meta charset"UTF-8"><title>轮廓和圆角</title><style>.box1{width: 200px;height: 200px;background-color: #BBFFAA;/*box-shadow用来设置元素的的阴影效果&…

Idea项目遇到的错误整理

解决方案 1.Maven 加入新的子模块module, 重新编译报错&#xff1a;找不到类/符号/程序包 需要清空Idea缓存&#xff0c;重新编译 File -> Invalidate Cahes... 转载于:https://www.cnblogs.com/atongmumu/p/7027050.html

对不起,我爱你

在学校上传了一部“对不起&#xff0c;我爱你”&#xff0c;据说很多人都喜欢看&#xff0c;对我 而言没有时间去看了&#xff0c;不过原声大碟倒是常常放到我的“Beep-media-player”里边&#xff0c;大四了&#xff0c;也常常觉得时间的珍贵&#xff0c;许多事情仿佛也懂了许…

流水账,从我开始接触计算机时写起

我第一次接触计算机是在读初二的时候&#xff0c;每周有一节微机课&#xff0c;记得那时大家都挺喜欢上这门课的&#xff0c;一到上课时间就往机房冲&#xff0c;生怕自己去晚了占不了机子&#xff0c;我也是懵懵懂懂的在老师的指导下&#xff0c;在一台黑白屏的电脑上学会了打…

装饰模式(Decorator)

1、概念 装饰模式动态地给一个对象添加一些额外的职责。就扩展功能而言&#xff0c;它比生成子类方式更为灵活&#xff0c;属于结构性模式一种。 2、模式结构 抽象组件角色(Component)&#xff1a;定义一个对象接口&#xff0c;以规范准备接受附加责任的对象&#xff0c;即可以…

css 背景样式学习

背景样式主要有5个属性&#xff1a; 1. background-color 背景颜色 2.background-img 背景图像 3.background-repeat 背景图像如何重复(no-repeat repeat repeat-x repeat-y inherit) 4.background-position 定位背景图像位置(top right bottom left center) 5.background-at…

CSS之定位(定位/相对定位)

定位/相对定位&#xff1a; <!DOCTYPE html> <html><head><meta charset"utf-8" /><title>定位/相对定位</title><style>body{font-size: 60px;}.box1{width: 200px;height: 200px;background-color: #bfa;}.box2{width:…

GARFIELD@01-24-2005

the kickoff of not being bored 转载于:https://www.cnblogs.com/rexhost/archive/2005/01/24/96477.html

(To Me Just)c#中的WebBrowser类的使用注意事项!

Visual C# 打造 “浏览器” try { if(tabControl.SelectedIndex 0) { axWebBrowser1.ExecWB(SHDocVw.OLECMDID.OLECMDID_SAVEAS, SHDocVw.OLECMDEXECOPT.OLECMDEXECOPT_DODEFAULT); } else if(tabControl.SelectedIndex 1) { …

CSS之定位(绝对定位)

绝对定位&#xff1a; <!DOCTYPE html> <html><head><meta charset"utf-8" /><title>绝对定位</title><style>body{font-size: 60px;position: relative;}.box1{width: 200px;height: 200px;background-color: #bfa;}.bo…

python pexpect包的一些用法

转自&#xff1a;https://www.jianshu.com/p/cfd163200d12 mark一下&#xff0c;原文中写的挺详细 转载于:https://www.cnblogs.com/renxchen/p/9935888.html

编译工具 之 ant

一、概述需要设置的环境变量&#xff1a;JAVA_HOME"D:\JDK",ANT_HOME"D:\ant",PATH".,%JAVA_HOME%\bin,%ANT_HOME%bin"运行&#xff1a;ant -buildfile test.xml -Dbuildbuild/classes dist&#xff08;含义为&#xff1a;执行test.xml的编译脚本…

微酷WeiKuCMS现赠送高速开发系统软件。公司、程序猿的福音呀!

我国电子商务面临的问题。淘宝退出百度无疑是一个遗憾。当在网上购物时。用户面临的一个非常大的问题就是怎样在众多的站点找到自己想要的物品。并以最低的价格买到。自从淘宝退出百度。建立自己的搜索引擎后。广大消费者再也不能再百度里面直接搜索有关淘宝的商品了&#xff0…

网友为对百合所唱的最后的挽歌!(节选)

dudu&#xff0c;不要删好吗&#xff0c;太郁闷了&#xff0c;太郁闷了&#xff0c;太郁闷了 sigh, 如果真的3.20日是末期的话&#xff0c;我所承诺的开源&#xff0c;只不过是一个玩笑罢了 参见&#xff1a;http://bbs.nju.edu.cn/blogall 网友为对百合所唱的最后的挽歌&#…

人工智能入门(二):语音识别基本模型

spectral analysis和formants&#xff0c;倒频谱&#xff0c;mel谱等feature有关&#xff1b; training和recognition涉及到&#xff1a;基础的&#xff08;DWT&#xff0c;HMM&#xff0c;Viterbi等&#xff09;&#xff1b;高阶的&#xff08;deep learning等&#xff09;。…

也谈文件夹同步

前言 1 同步分为文件级别&#xff0c;和块级别。rsync是块级别。 2 如果是基于微软文件共享或samba协议&#xff0c;用robocopy.exe即可文件级别的同步。 3 通过任务计划&#xff0c;实现自动&#xff0c;定时同步。 4 如果是ftp&#xff0c;sftp&#xff0c;用powershellwinsc…