在C++中离不开类的定义,而构造函数则是类的定义中很重要的一环。
我们在构造函数中常常见到如下定义:
```
class Clock{
public:
Clock (int newH,int newM,int newS) ;
•
•
•
private:
int hour, minute, second;
};
Clock::Clock (int newH, int newM, int newS) :hour (newH), minute (newM), second (newS) {}
```
在这个例子中,构造函数的参数表后面为什么有“:”呢。
简洁的说,这就是一种初始化的方式。同样的,初始化还可以采取下面这种形式:
```
Clock::Clock(int newH,int newM,int newS)
{
hour=newH;
minute=newM;
second=newS;
}
```
要在构造类的对象时,这两种构造函数都是能够对对象进行初始化的。
那么问题又来了:这两种方式有什么区别呢?
首先,我们看看这两种初始化的方式:
```
Clock::Clock(int newH,int newM,int newS) :hour (newH), minute (newM), second (newS) {}
Clock::Clock(int newH,int newM,int newS)
{
hour=newH;
minute=newM;
second=newS;
}
```
再来对比一下
```
int i,j;
int a(i);
int b(j);
int a=i;
int b=j;
```
这两种是不是很相似呢?
其实构造函数有无冒号后面的初始化就相当于我们普通赋值变量的两种方式。所以带冒号的可以看作是括号赋值,无冒号的则是赋值运算符赋值。
而这两种方式的区别就在于,括号赋值是在给变量分配内存空间的同时对它进行初始化,而赋值运算符赋值则是先分配内存空间,然后再初始化。说到底就是初始化的时机不同。
那么干嘛要这样区分,平时我们赋值变量的时候用哪种都可以呀?
这两种区分方式呢主要是对三种数据类型比较有用:
1、常量数据类型(const 类型)
2、引用数据类型(&变量)
3、没有默认构造函数的类对象(一个类中含有另一个类)
由于常量数据的数据必须是一开始就初始化好,而不能之后再做改变;引用数据类型由于引用是和某一变量维系在一起了,所以不能之后再改变;类(A类)中的数据是另一个类(B类)的对象,而B类在定义时没有默认构造函数,那么在A类定义中的构造函数必须采用冒号赋值,否则报错。
以上就是全部内容。