您的位置:首页 > 其它

构造函数 参数初始化列表

2017-04-25 19:27 375 查看

建立类对象时会自动调用构造函数

构造函数不需且不能手动调用

默认构造函数:在建立对象时不必给出实参的构造函数。包括无参构造函数和全部参数都有默认值的构造函数。

如果用户没有定义构造函数,则系统会自动提供一个默认构造函数,即上述的无参构造函数,函数体为空。

参数初始化表的必要性

当给类中的私有常量定义时,必须通过参数初始化列表来定义,因为参数初始化表是先于函数体执行的,而常量不允许修改。

class Circle
{
public:
Circle():m_dPi(3.14){}
private:
const double m_dPi;
};


下面这种写法是不被允许

Circle(){m_dPi=3.14;}


使用默认参数的构造函数

在声明构造函数时指定默认值,而不能只在定义构造函数时指定默认值。

因为构造函数的声明在类定义中,而类定义是放在头文件中的,是类的对外接口,而构造函数的定义是类的实现细节,用户不一定看得到。这一特点在分文件中尤其明显。

class Box{
public:
Box(int h=10,int w=20,int len =30);
//声明构造函数时指定默认参数
/*
声明构造函数时形参名可以省略(形参名不重要),即写成
Box(int =10,int =20,int=30);
*/
private:
int height;
int weight;
int length;
};
Box::Box(int h, int w, int len){    //定义构造函数时可以不指定默认参数
height=h;
weight=w;
length=len;
}


拷贝构造函数

定义格式 :类名(const 类名 & 变量名)

注:一般约定加const声明,避免在调用此函数时修改实参对象。

当采用直接初始化或赋值初始化实例化对象时系统会自动调用拷贝构造函数。

如果没有显性定义的拷贝构造函数则系统会自动生成一个默认的拷贝构造函数。

class Student{
public:
Student(){m_strName="Jim";}
/*
默认的拷贝构造函数:
Student(const Student &stu){}
*/
Student(const Student &stu){m_strName=stu.m_strName}
//显性定义的拷贝构造函数
private:
string m_strName;
};

int main()
{
Student stu1;
Student stu2=stu1;
Student stu3(stu1);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  构造函数