构造函数里面赋值和初始化列表的方式
首先,对于初始化列表的方式:一般不要使用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,但是记住,不是创建对象的时候一定会调用构造函数,这里是创建对象,开辟出一块空间之后,这里就利用传入的对象进行拷贝构造函数,也就是只执行了一次拷贝构造函数,所以这个过程的效率更高一点。