构造函数

来源:互联网 发布:nvidia与windows不兼容 编辑:程序博客网 时间:2024/04/29 18:34

定义如何对类类型成员进行初始化的成员函数称为构造函数

构造函数的名字与类的名字相同,并且不能指定返回类型!(没有return语句)

默认构造函数:因为它是"默认"运行的,如果没有提供初始化式,那么就会使用默认构造函数,不管变量在哪里定义,默认构造函数都会被使用。为所有形参提供默认实参的构造函数也定义了默认构造函数

有的类有默认构造函数,如string类定义了默认构造函数来初始化string变量为空字符串,即没有字符的字符串。

如string s;  //这时候字符串s为空串s=""

有些类类型没有默认构造函数,对这些类,必须显式的初始化

构造函数是特殊的成员函数,只要创建类类型的新对象,都要执行构造函数。构造函数的工作是保证每个对象的数据成员具有合适的初始值。构造函数可以没有形参也可以有多个形参。构造函数可以被重载,一个类的构造函数的数量没有限制

构造函数初始化列表:

对类

class Person

{

Public:

......

Private:

string name;

string adress;

int age;

}

以一个冒号开始,接着是一个逗号分隔的数据成员列表,每个数据成员后面跟着一个房子圆括号中的初始形式

Person(const int &ag):age(ag),name("Tom"),adress("NanJing"){ }                   //别忘了后面的大括号

也可以写成:

Person(const int &ag)

{

age=ag;

name="Tom";

adress="NanJing";   

}

实参决定使用哪个构造函数,编译的时候会自动完成调用

只要创建该类型的一个对象,编译器就运行一个构造函数

const 构造函数是不必要的,因为构造函数的工作是初始化对象,不管对象是不是const,都用一个构造函数来初始化该对象

另外初始化const或引用类型数据成员的唯一的机会是在构造函数初始化列表中,即第一种方式下,第二种中不能直接对const赋值

构造函数初始化列表仅指定用于初始化成员的值,而不指定初始化成员的执行次序,成员被初始化的次序就是定义成员的次序。对上面的类来说name先初始化,adress和age再初始化(按定义的顺序来)

在构造函数中使用默认实参可以减少代码重复

只有当一个类没有定义构造函数的时候,编译器才会自动的生成一个默认构造函数

类通常应定义一个默认构造函数

合成的默认构造函数(synthesized default constructor)使用与变量初始化相同的规则来初始化成员,具有类类型的成员通过运行各种的默认构造函数来进行初始化,当对象定义在局部作用域中时,内置或复合类型的成员不进行初始化