在C++的类中,如果没有显示的构造函数,那么系统是会自动生成一个默认的构造函数。但是这个默认构造函数的函数体是空的,不起初始化作用。
因此,如果想要方便灵活的进行初始化,就需要自己动手写构造函数喽!
一般来说呢,显示的构造函数有三种方法:(我自己总结的啦,感觉不合理可以指出哦)
1:简单赋值
<span style="font-size:14px;color:#006600;"> Aclass::Aclass(int a, int b)
{
x = a;
y = b;
}</span>
诸如此类
2:给定默认值
<span style="font-size:14px;"><span style="color:#006600;"> Aclass::Aclass() 或者 Aclass::Aclass(int a = 0, int b = 1)
{ {
x = 0; x = a;
y = 1; y = b;
} }</span>
</span>
诸如此类
3:使用成员初始化列表
<span style="font-size:14px;color:#006600;"> Aclass::Aclass():x(0),y(1){ } //给定初始值
或者
Aclass::Aclass(int a, int b):x(a),y(b){ }</span>
诸如此类
(1)细节问题
1 这两种方法相比,第二种是更好的选择。原因有两点:特殊情况下的必要性与高效性。
2 如果在类中显示的定义了构造函数,则系统将不会再提供默认构造函数。此时,如果没有提供相应参数的构造函数,如空参构造,则不允许空参构造。例如若果只有如下构造函数,则Aclass A;时将会报错,而需要写成Aclass A(2, 3); 。
<span style="font-size:14px;color:#006600;"> Aclass::Aclass(int a, int b)
{
x = a;
y = b;
}</span>
3 为了解决上述问题,可以对构造函数进行重载,从而满足各种需求。但如果一个类中定义了全部都是默认参数的构造函数后,便不能再定义重载构造函数。
(2)关于使用成员初始化列表的必要性解释
1 const数据成员必须在初始化列表中初始化;
2 引用成员必须在初始化列表中初始化;
3 若在Aclass类中有Bclass类成员,即:
<span style="font-size:14px;"><span style="color:#006600;"> class Aclass
{
public:
Bclass B;
Aclass();
}
Aclass::Aclass():B(2){ }</span>
</span>
4 数组成员不能在初始化列表中初始化;
5 初始化列表中的执行顺序是根据声明顺序决定的,而不是你书写的顺序呦:
<span style="font-size:14px;"><span style="color:#006600;"> class Aclass
{
public:
int a;
int b;
Aclass();
}
Aclass::Aclass():b(0),a(b){ }
</span></span>
此时并不会得到a = b = 0的效果,因为会先执行a(b),而此时b还没有具体值,因此这里a会得到一个人任意分配的数值。
----------------------------------------------------------------------------萌萌哒分界线---------------------------------------------------------------------------------
下面是从豆瓣参考到了一段总结而写的,个人认为比较简单明了。基本上注意到const与static的特殊性就没有太大问题啦。
原文地址:http://www.douban.com/note/66957147/
关于构造函数就说这么多吧。
如有侵权,敬请告知,立马删除。谢谢