构造函数在类体里的声明形式:
类名(形参一,形参二,…);//也可以没有形参
构造函数的定义形式:
假设数据成员为x1,x2,…x,类外定义构造函数时通常有3种形式:
1、类名::类名(形参1,形参2,…):x1(形参1),x2(形参2),…{ }
2、类名::类名(形参1.形参2,…){ x1=形参1; x2=形参2;…}
3、类名::类名()//成员变量所赋的初值都是固定的
{
x1=初始化表达式;
x2=初始化表达式;
…
}
说明:
1、构造函数的名字必须和类名相同;
2、在定义构造函数时不能指定返回类型,既不要返回值,即使是void类型也不可以。
3、另外类可有多个构造函数,即函数重载;或重载;
4、构造函数的参数在排列时无顺序要求,只要保证相互对应即可;
5、构造函数可以使用默认参数;
6、在程序中说明一个对象时,程序自动调用构造函数来初始化该对象;
注意:
自动调用类的后遭函数的时机是:
定义类的成员函数、成员对象及友元函数及友元函数时,均不调用类的构造函数。仅当定义类的对象时,才有系统自动调用类的构造函数。
构造函数的使用
注意:使用new创建对象时,下面两种都是合法的:
myData *pd=new myData() //带括号
myData *pd=new myData
用户定义了构造函数,都会调用构造函数进行初始化;
用户未定义构造函数,对带括号的情况,系统在为成员变量分配内存的同时,将其初始化为0.不加括号时,系统只为成员变量分配内存空间,但不进行内存的初始化,成员变量的值是随机的。
复制构造函数与类型转换构造函数
复制构造函数是构造函数的一种,也称为拷贝构造函数。
复制构造函数的作用:使用一个已存在的对象去初始化另一个正在创建的对象。
复制构造函数其原型为:
类名::类名(类名&)//对象的引用作为形参
或类名::类名(const类名&)//为了不改变原有对象,使用const限制
注意:如果类中没有给出复制构造函数,那么编译器会自动生成一个默认复制构造函数。
Student stud;
Student ss[2]={stud,Student()};
//创建ss[0]中的对象时,用到了默认复制构造函数。等效一下:
Student ss[2];
ss[0]=Student(stud);//调用默认复制构造函数
ss[1]=Student();//调用构造函数
析构函数
析构函数的作用是在对象消失时,释放由构造函数分配的内存;
析构函数在类体里的声明形式:~类名();
析构函数的定义形式:类名::~类名(){}
类只能定义一个析构函数,且不能有参数;
如果程序中没有定义析构函数,则编译器自动生成默认的析构函数,默认析构函数的函数体为空。