基本写法
class CMyClass {
CMyClass(int x, int y);
int m_x;
int m_y;
};
CMyClass::CMyClass(int x, int y) : m_y(y), m_x(m_y) {};
构造函数参数存在class定义的类型时,使用初始化列表会少一次构造调用
#include <iostream>
using namespace std;
class Hand {
public:
Hand() {
cout << "调用Hand构造函数\n";
};
};
class Person1 {
public:
Hand m_hand;
Person1(Hand &hand){
m_hand = hand; // 在这里进行第二次构造函数调用
};
};
class Person2 {
public:
Hand m_hand;
Person2(Hand &hand) : m_hand(hand) {
};
};
int main() {
cout << "不使用初始化列表:\n";
Hand hand1;
Person1 p1 = Person1(hand1);
cout << "\n 使用初始化列表:\n";
Hand hand2;
Person2 p2 = Person2(hand2);
return 0;
}
/* 程序输出 */
/*
不使用初始化列表:
调用Hand构造函数
调用Hand构造函数
使用初始化列表:
调用Hand构造函数
*/
必须使用初始化列表的情况:
1.常量成员,因为常量只能初始化不能赋值,所以必须放在初始化列表里面;
using namespace std;
class Person1 {
public:
const string m_realName;
Person1(string name) : m_realName(name){};
};
2.引用类型,引用必须在定义的时候初始化,并且不能重新赋值,所以也要写在初始化列表里面
using namespace std;
class thread_guard {
public:
thread & m_thread;
thread_guard(thread &t) : m_thread(t) {};
};
3. 没有默认构造函数的类类型,因为使用初始化列表可以不必调用默认构造函数来初始化,而是直接调用拷贝构造函数初始化
#include <iostream>
using namespace std;
class Mind1 {
public:
// 显示声明了构造函数,系统不会生成默认构造函数
Mind1(string info) {
cout << info << endl;
};
};
//class Mind2 {
//private:
// // 默认构造函数被声明为private类型, 系统不会生成默认构造函数
// Mind2() {};
//};
class Person {
public:
Mind1 m_mind1;
// 只能使用初始化列表进行初始化
Person(Mind1 &m1) : m_mind1(m1) {};
};
int main() {
Mind1 mind1 = Mind1("mind1 info");
Person p = Person(mind1);
return 0;
}
初始化列表顺序
class foo
{
public:
int i; int j;
foo(int x):i(x), j(i) {}; // ok, 先初始化i,后初始化j
};