构造函数里面赋值和初始化列表的方式

首先,对于初始化列表的方式:一般不要使用this指针,因为对象此时还没有创建。但是对于构造函数赋值能不能使用:这个还不确定?放在这里。。。。。。

其次,const一般不要修饰构造函数,因为这个修饰之后,构造函数里面的数据都不可以改变,这就违背使用构造函数最初的目的了(为了赋值初始化)

转载原文地址:

https://www.cnblogs.com/renzhuang/articles/6616727.html

这是CMember类

构造函数里面赋值和初始化列表的方式

#ifndef _CMEMBER_H_
#define _CMEMBER_H_

#include <iostream>
using namespace std;

class CMember
{
public:
    CMember()
    {
        cout << "CMember constructor 1" << endl;
        cmember = 0;
    }
    CMember(CMember& obj)
    {
        cout << "CMember copy constructor" << endl;
    }
    CMember(int _cmember)
    {
        cout << "CMember constructor 2" << endl;
        cmember = _cmember;
    }

    CMember& operator =(CMember& obj)
    {
        cout << "CMember =" << endl;
        return *this;
    }

    int cmember;
};

#endif _CMEMBER_H_

构造函数里面赋值和初始化列表的方式

这是MClass类

构造函数里面赋值和初始化列表的方式

#ifndef _MCLASS_H_
#define _MCLASS_H_

#include <iostream>
using namespace std;

#include "CMember.h"

class MClass
{
    //MClass(CMember& _cm) :cm(_cm)
    //{
    //    //cm = _cm;
    //}
public:
    MClass(CMember& _cm)   
    {
        cm = _cm;
    }

    CMember cm;


};

#endif _MCLASS_H_

构造函数里面赋值和初始化列表的方式

//因为这里创建好的cm对象,并且没有其他方式给这个对象进行初始化(下面一种方式是使用拷贝构造函数给对象进行初始化,不需要使用默认构造函数进行初始化),使用默认的构造函数进行初始化,然后再调用赋值函数进行初始化赋值。

(因为编译器总是确保所有成员对象在构造函数体执行之前初始化,所以类类型的数据成员对象,在进入构造函数体之前已经完成构造。例子中编译的代码将调用CMember:: CMember()来初始化cm(这里调用一次CMember构造函数),这在控制到达赋值语句前完成。接下来有调用一个赋值运算符函数。结果是调用了两个Cstring函数(构造函数和赋值操作符)。)

我们测试一下:

构造函数里面赋值和初始化列表的方式

#include <iostream>
using namespace std;

#include "CMember.h"
#include "MClass.h"

void main()
{
    CMember c1(1);
    MClass m1(c1);

    getchar();
    
    
}

构造函数里面赋值和初始化列表的方式

输出如下:

构造函数里面赋值和初始化列表的方式

 

 

下面我们试一下,初始化列表方式。

MClass(CMember& _cm) :cm(_cm)
    {
        
    }

//在这种情况下,cm开辟好了这块空间,直接通过传进来的对象给这个新建的对象进行初始化,不需要调用默认的构造函数初始化,这种效率会更高一点。

输出:

构造函数里面赋值和初始化列表的方式

只调用一次copy构造函数。

MClass(CMember& _cm)

{

cm = _cm;

}

因为这里已经使用到了这个对象cm,所以必须先对它进行无参构造函数初始化,然后进行赋值操作函数

MClass(CMember& _cm) :cm(_cm) { }

这里虽然同样创建了对象cm,但是记住,不是创建对象的时候一定会调用构造函数,这里是创建对象,开辟出一块空间之后,这里就利用传入的对象进行拷贝构造函数,也就是只执行了一次拷贝构造函数,所以这个过程的效率更高一点。