C++学习笔记(十三):构造函数

构造函数

1、 什么是构造函数

每个类都分别定义了它的对象被初始化的方式,类通过一个或几个特殊的成员函数来控制其对象初始化的过程,这些函数即——构造函数。

构造函数的任务就是初始化对象的数据成员,无论何时只要类的对象被创建,就会执行构造函数。

2、 构造函数与其他函数的异同

相同之处:

①构造函数有一个(也可能是0个)参数列表和一个(也可能是0个)函数体。

②一个类可以包含多个构造函数,这和重载函数是一样的

相异之处:

①构造函数的名字和类名相同,而其他函数则不行。

②构造函数没有返回类型。

③构造函数不能被声明成const。

3、 默认构造函数

有时候我们没有为类中的对象提供初始值,但是其对象肯定是要初始化的,实际上它们执行了默认初始化的过程。类通过一个特殊的构造函数来控制默认初始化过程,这个函数叫做——默认构造函数。默认够造函数无须任何的实参

如果我们的类没有显示的定义构造函数,那么编译器会为我们隐式的定义一个默认构造函数——合成的默认构造函数。

一般来说,对于任何的类都需要定义其自己的默认构造函数,因为有时候某些类不能依赖于合成默认构造函数,原因有三点:

①编译器只有在发现类不包含任何构造函数时才会替我们生成一个默认构造函数。一旦定义了一些其他的构造函数,那么除非我们再定义一个默认构造函数,否则将没有默认构造函数。

②对于某些类来说,合成的默认构造函数可能执行的是错误的操作。比如在类中数组或者指针类型被默认初始化,那他们的值是未定义的。

③有时候编译器不能为某些类合成默认的构造函数。比如,如果类中包含一个其他类的类型成员,且这个类型成员没有默认构造函数,那么编译器将无法初始化该成员。

4、 定义构造函数

以下面的例子开始作介绍:

struct  Sales_data{

Sales_data() = default;   //采用默认构造函数

Sales_data(const string &s, unsigned int n,double p):

bookNo(s),units_sold(n),revenue(p*n){ }

//构造函数初始值列表

};

在上面的程序段中,

Sales_data() = default;

此构造函数不接受任何的形参,因此他是一个默认构造函数。在这里定义这个构造函数的意义在于我们既需要其他形式的构造函数,也需要默认构造函数。这里的这个函数完全等同于使用合成的默认构造函数。

在C++11新标准中,如果我们需要默认行为,那么可以通过在参数列表后面写上=default来要求编译器生成构造函数。

再来看这句程序:

Sales_data(const string &s, unsigned int n,double p):

bookNo(s),units_sold(n),revenue(p*n) { }

这个定义中出现了新的表达方式和新的成分。我们将上面的语句分为三个部分:

1、“()”中的形参列表;

2、冒号“:”和花括号“{}”之间的代码。

3、“{}”中的内容。

对于1和3我们都好理解,对于2中新出现的表达方式,我们称之为——构造函数初始值列表。这个初始值列表的功能是负责为新创建的对象的一个或几个数据成员赋初始值。构造函数初始值是成员名字的一个列表,每个名字后面紧跟着用“()”括起来的成员初始值。不同的成员初始化通过逗号分隔开。

另外,我们注意到上面的两个构造函数的函数体都是空的。这是因为这些构造函数的唯一目的就是为数据成员赋初值。

下面再看一段代码:

Sales_data:Sales_data(std::istream &is)

{

read(is , *this);  //read函数的作用是从is中读取数据并存储在

//this对象中

}

上面这个构造函数是在类的外部定义的。在外部定义与在类的内部定义,方法是一样的。只是这个构造函数没有构造函数初始值列表,或者说其初始值列表是空的。

时间: 2024-11-15 06:28:00

C++学习笔记(十三):构造函数的相关文章

java之jvm学习笔记十三(jvm基本结构)

java之jvm学习笔记十三(jvm基本结构) 这一节,主要来学习jvm的基本结构,也就是概述.说是概述,内容很多,而且概念量也很大,不过关于概念方面,你不用担心,我完全有信心,让概念在你的脑子里变成图形,所以只要你有耐心,仔细,认真,并发挥你的想象力,这一章之后你会充满自信.当然,不是说看完本章,就对jvm了解了,jvm要学习的知识实在是非常的多.在你看完本节之后,后续我们还会来学jvm的细节,但是如果你在学习完本节的前提下去学习,再学习其他jvm的细节会事半功倍. 为了让你每一个知识点都有迹

Swift学习笔记十三:继承

一个类可以继承(inherit)另一个类的方法(methods),属性(property)和其它特性 一.基本语法 class Human{ var name :String init(){ name = "human" println(name) } func description(){ println("name:\(name)") } } class Student:Human{ var score = 0 init(){ super.init() name

laravel3学习笔记(十三)

原作者博客:ieqi.net ==================================================================================================== 类的自动载入 使用 PHP 自身的 include 或者 require 族的函数载入重用代码一般情况下很难帮助我们更好的组织工程代码,对于此,从便捷和性能的方面考虑, Laravel3 为我们提供了类的自动载入功能.自动载入可以让我们在需要的时候才载入所需要的类文件

Go语言学习笔记十三: Map集合

Go语言学习笔记十三: Map集合 Map在每种语言中基本都有,Java中是属于集合类Map,其包括HashMap, TreeMap等.而Python语言直接就属于一种类型,写法上比Java还简单. Go语言中Map的写法比Java简单些,比Python繁琐. 定义Map var x map[string]string x : = make(map[string]string) 写法上有些奇怪,map为关键字,右侧中括号内部为key的类型,中括号外部为value的类型.一般情况下使用逗号或者冒号

[傅里叶变换及其应用学习笔记] 十三. 分布的傅里叶变换

这份是本人的学习笔记,课程为网易公开课上的斯坦福大学公开课:傅里叶变换及其应用. 分布傅里叶变换的定义 在傅里叶变换领域中,测试函数$\varphi$选择了速降函数(Schwartz Functions).与之对应的分布$T$通常被称为缓增分布(Tempered Distributions). $<T,\varphi>$ 上式表示了,给定测试函数$\varphi$,分布$T$对测试函数$\varphi$进行作用,得到的结果为一个数值,该过程也被称为匹配(Pair).这种作用是通过积分来实现的.

西门子PLC学习笔记十三-(算术运算指令与控制指令)

今天在写一篇PLC的学习笔记,本篇将介绍PLC最基本的运算指令与控制指令,本篇将直接上截图. 1.基本算数运算指令 1)整数运算 2)长整数运算 3)实数运算 . STL编程示例(16位整数的算术运算) L IW10 //将输入字IW10装入累加器1的低字 L MW12 //将累加器1低字中的内容装入到累加器2的低字 //将存储字MW12装入累加器1的低字 +I //将累加器2低字和累加器1低字相加,结果保存到累加器1的低字中 +68 //将累加器1的低字中的内容加上常数68,结果保存到累加器1

Java基础学习笔记十三 常用API之正则表达式、Date、DateFormat、Calendar

正则表达式 正则表达式(英语:Regular Expression,在代码中常简写为regex).正则表达式是一个字符串,使用单个字符串来描述.用来定义匹配规则,匹配一系列符合某个句法规则的字符串.在开发中,正则表达式通常被用来检索.替换那些符合某个规则的文本. 正则表达式的匹配规则 参照帮助文档,在Pattern类中有正则表达式的的规则定义,正则表达式中明确区分大小写字母.我们来学习语法规则. 正则表达式的语法规则: 字符:x 含义:代表的是字符x 例如:匹配规则为 "a",那么需要

java jvm学习笔记十三(jvm基本结构)

欢迎装载请说明出处:http://blog.csdn.net/yfqnihao 这一节,主要来学习jvm的基本结构,也就是概述.说是概述,内容很多,而且概念量也很大,不过关于概念方面,你不用担心,我完全有信心,让概念在你的脑子里变成图形,所以只要你有耐心,仔细,认真,并发挥你的想象力,这一章之后你会充满自信.当然,不是说看完本章,就对jvm了解了,jvm要学习的知识实在是非常的多.在你看完本节之后,后续我们还会来学jvm的细节,但是如果你在学习完本节的前提下去学习,再学习其他jvm的细节会事半功

yii2源码学习笔记(十三)

模型类DynamicModel主要用于实现模型内的数据验证yii2\base\DynamicModel.php 1 <?php 2 /** 3 * @link http://www.yiiframework.com/ 4 * @copyright Copyright (c) 2008 Yii Software LLC 5 * @license http://www.yiiframework.com/license/ 6 */ 7 namespace yii\base; 8 9 use yii\v

Thinking in Java,Fourth Edition(Java 编程思想,第四版)学习笔记(十三)之Strings

Immutable Strings Objects of the String class are immutable. If you examine the JDK documentation for the String class, you’ll see that every method in the class that appears to modify a String actually creates and returns a brand new String object c