<C++略识>之构造函数及初始化列表

来源:互联网 发布:软件测试 培训 编辑:程序博客网 时间:2024/06/07 08:10

初始化类的成员有两种方式:一是在构造函数体内进行赋值操作,二是使用初始化列表。

构造函数的特点:
- 构造函数在对象实例化时被自动调用;
- 构造函数必须与类同名;
- 构造函数没有返回值;
- 构造函数可以有多个重载形式;
- 实例化对象时仅用到一个构造函数;
- 当用户没有定义构造函数时,编译器将自动生成一个构造函数。

默认构造函数的定义:在实例化对象时,不需要传递参数的构造函数称之为默认构造函数。

初始化列表的写法:在构造函数后面需要用冒号隔开,对于多个数据成员进行初始化的时候,中间要用逗号隔开,赋值时要用括号进行赋值,而不能用等号进行赋值。

初始化列表特性:
-初始化列表先于构造函数执行—意味着编译器会先给初始化列表中的数据成员赋值,再执行构造函数中的相关代码。
-初始化列表只能用于构造函数
-初始化列表可以同时初始化多个数据成员

为什么要使用初始化列表?初始化列表的好处有哪些?
【解释】这是因为有些成员变量的初始化必须放在初始化列表里。构造函数初始化时必须采用初始化列表一共有三种情况:
没有默认构造函数的类类型,因为使用初始化列表可以不必调用默认构造函数来初始化,而是直接调用拷贝构造函数初始化(实例一可说明)。
—需要初始化const修饰的类成员;(因为const的成员不能改变,所以不能对其进行赋值,只能对其进行初始化)
—需要初始化引用成员数据;(引用一开始必须初始化,并且已经初始化的引用不能再变)

对于后面两种情况,用下面一个实例来解释:

class Circle{public:    //Circle(double p = 3.14)  //此种初始化编译错误,因为m_dPi是常量,不能再给它进行赋值    //{    //  m_dPi = p;       //  m_iR = m_dPi;      //}    Circle(double p, int r):m_dPi(p),m_iR(r) {} //必须这样对m_dPi进行初始化   private:    const double m_dPi; //常量变量    int &m_iR;  //引用变量}

关于初始化列表,另外一点需要注意的是: 成员是按照他们在类中出现的顺序进行初始化的,而不是按照他们在初始化列表出现的顺序初始化的。

拷贝构造函数的定义: 类名(const 类名 &变量名)
• 如果没有自定义拷贝构造函数,则系统会自动生成一个默认的拷贝构造函数。
• 当采用直接初始化或复制初始化实例化对象时,系统自动调用拷贝构造函数。

拷贝构造函数的调用情况
• 当用类的一个对象初始化另一个对象时,比如:

int main(){    Coordinate coor1(1,2);    Coordinate coor2(coor1);  //用对象coor1初始化对象coor2,拷贝构造函数被调用    Coordinate coor3 = coor1; //用对象coor1初始化对象coor3,拷贝构造函数被调用         return 0;  }

• 如果函数的参数是一个类的对象,那么在进行实参到形参的传递的时候会调用拷贝构造函数,比如:

void fun(Coordinate coor){    // to do......}int main(){    Coordinate coor1(1,2);    fun(coor1); //函数的形参为类的对象时,当调用函数时,拷贝构造函数被调用    return 0;}

• 如果函数的返回值是一个对象,那么函数执行完返回调用者时调用拷贝构造函数,比如:

int main(){    Coordinate coor;    coor = fun(); //函数返回值是对象,函数执行完,拷贝构造函数被调用    return 0;}

[注意]:对于拷贝构造函数,由于参数是确定的,所以不能进行重载。

析构函数的特性:
• 如果没有自定义析构函数,那么系统会自动生成一个析构函数。(这一点与构造函数和拷贝构造函数类似)
• 析构函数在对象销毁时被自动调用(与其相对的构造函数,则是在对象实例化时被自动调用)
• 析构函数没有返回值,也没有参数,也就不能重载

0 0
原创粉丝点击