为什么用成员初始化列表会快一些?
说明:数据类型可分为内置类型和用户自定义类型(类类型),对于用户自定义类型,利用成员初始化列表效率高。
原因:用户自定义类型如果使用类初始化列表,直接调用该成员变量对应的构造函数即完成初始化;如果在构造函数中初始化,因为 C++ 规定,对象的成员变量的初始化动作发生在进入构造函数本体之前,那么在执行构造函数的函数体之前首先调用默认的构造函数为成员变量设初值,在进入函数体之后,调用该成员变量对应的构造函数。因此,使用列表初始化会减少调用默认的构造函数的过程,效率高。
#include <iostream> using namespace std; class A { private: int val; public: A() { cout << "A()" << endl; } A(int tmp) { val = tmp; cout << "A(int " << val << ")" << endl; } }; class Test1 { private: A ex; public: Test1() : ex(1) // 成员列表初始化方式 { } }; class Test2 { private: A ex; public: Test2() // 函数体中赋值的方式 { ex = A(2); } }; int main() { Test1 ex1; cout << endl; Test2 ex2; return 0; } /* 运行结果: A(int 1) A() A(int 2) */
实验:
#include<iostream> using namespace std; class A { private: int m_a; public: A() { cout << "A default constructor" << endl; }; A(int a) : m_a(a) { cout << "one para constructor" << endl; }; ~A() { cout << "A deconstructor" << endl; } //拷贝构造 A(const A& a) { cout << "copy constructor" << endl; this->m_a = a.m_a; } //拷贝赋值 A& operator = (const A& a) { if (this == &a) { return *this; } this->m_a = a.m_a; cout << "copy assignment" << endl; return *this; } }; class Test1 { private: A m_A; public: Test1() { cout << "Test1 default constructor" << endl; }; Test1(int a) : m_A(a) { cout << "Test1(int)" << endl; } }; class Test2 { private: A m_A; public: Test2() { cout << "Test2 default constructor" << endl; }; Test2(int a) { m_A = A(a); cout << "Test2(int)" << endl; } }; int main(){ Test1 test1(1); cout << endl; Test2 test2(2); }
输出:
one para constructor Test1(int) A default constructor one para constructor copy assignment A deconstructor Test2(int) A deconstructor A deconstructor