c++重學筆記5 - 對象初始化

喜歡這篇文章嗎?喜歡的話去看博主的置頂博客,即可依據分類找到此文章的原版得到更好的體驗,

圖片及代碼顯示的問題,筆者深感抱歉,想要更好的體驗去原博文即可。


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-->
&emsp;&emsp; 這樣實現沒有問題,但是效率較低,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() {}```
## 小細節
&emsp;&emsp; c++標準規定了這裏的構造順序是與聲明順序爲序的,而不是冒號後面的順序。

# 不同編譯單元的非局部靜態變量順序問題
&emsp;&emsp; 先看代碼,這是一個.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;

結語

   不要亂寫類的構造函數,少寫非局部靜態變量。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章