喜歡這篇文章嗎?喜歡的話去看博主的置頂博客,即可依據分類找到此文章的原版得到更好的體驗,
圖片及代碼顯示的問題,筆者深感抱歉,想要更好的體驗去原博文即可。
title: c++重學筆記5 - 對象初始化
mathjax: true
date: 2020-03-13 16:57:30
categories: [c++重學筆記]
tags: [c++重學筆記]
keywords: [c++重學筆記]
對象在使用以前一定要初始化
基本數據類型這裏就不說了,直接講類
類的對象的初始化往往使用了構造函數,但是很多人不會寫構造函數,他們這樣實現
#include <iostream>
using namespace std;
class node {
int x;
public:
node() {}
node(int x_) { x = x_; }
};
class my_class {
node a, b, c, d;
public:
my_class(node a_, node b_, node c_, node d_) {
a = a_;
b = b_;
c = c_;
d = d_;
}
};
int main() {}```
<!---more-->
   這樣實現沒有問題,但是效率較低,c++標準保證類的構造函數調用之前初始化先調用成員的構造函數。這樣以來,my_class裏面的abcd都被先初始化再賦值了,通常我們使用冒號來構造他們。
```cpp
#include <iostream>
using namespace std;
class node {
int x;
public:
node() {}
node(int x_) : x(x_) {}
};
class my_class {
node a, b, c, d;
public:
my_class(node a_, node b_, node c_, node d_) : a(a_), b(b_), c(c_), d(d_) {}
};
int main() {}```
## 小細節
   c++標準規定了這裏的構造順序是與聲明順序爲序的,而不是冒號後面的順序。
# 不同編譯單元的非局部靜態變量順序問題
   先看代碼,這是一個.h
```cpp
#include <iostream>
using namespace std;
class my_class {};
extern my_class mls;
注意到有一個extern my_class mls;如果我們有多個編譯單元,每個都extern一些對象,這些對象初始化的順序,c++沒有規定,所以可能導致他們隨機的初始化,但是如果這些對象之間有要求有順序,怎麼辦?你亂序初始化可能會出錯的。這時候我們可以使用單例模式來保證正確的順序。
#include <iostream>
using namespace std;
class my_class {
public:
my_class& singleton() {
static my_class mls;
return mls;
}
};
// extern my_class mls;
結語
不要亂寫類的構造函數,少寫非局部靜態變量。