
聊一聊 C++的特性 explicit && 匿名空間
explicit關鍵字
首先看一下explicit的作用:explicit 是避免構造函數的參數自動轉換為類對象的標識符,平時代碼中并不是經常用到,但是,有時候就是因為這個,會造成一定的BUG出現,而我們卻苦苦查詢不到問題;
下面看一個例子來說明下:
案例一
test.cpp
#include?using?namespace?std;class?Test{public:????Test(int?a)????{????????_num?=?a;????}????int?getNum()????{????????return?_num;????}private:????int?_num;};int?main(){????Test?t?=?'c';????cout<
我們看下結果:
root@iZuf67on1pthsuih96udyfZ:~/C++/Net_C++/Lab_tt# g++ test.cpp -o testroot@iZuf67on1pthsuih96udyfZ:~/C++/Net_C++/Lab_tt# ./test 99
我們會發現,程序在內部就自動幫我們進行了轉換,假設我們本來是想得到是字符‘c’,但是被莫名的修改為了99,其實在一些程序中,我們沒有太關注這些自動轉換的狀態,但是我們閱讀一些開源代碼庫的時候,很多都會避免這類事情發生,而使用關鍵字explicit就是武器;
來看下構造函數使用explicit的效果:
案例二
#include?using?namespace?std;class?Test{public:????explicit?Test(int?a)????{????????_num?=?a;????}????int?getNum()????{????????return?_num;????}private:????int?_num;};int?main(){????Test?t?=?'c';????cout<
我們編譯一下:
root@iZuf67on1pthsuih96udyfZ:~/C++/Net_C++/Lab_tt# g++ test.cpp -o testtest.cpp: In function ‘int main()’:test.cpp:22:14: error: conversion from ‘char’ to non-scalar type ‘Test’ requested Test t = 'c';
我們會發現使用explicit關鍵字,避免了上面異常自動轉換的結果發生;
建議:我們編寫C++類的時候,如果能能把握住傳參的類型問題,可以忽略這個關鍵字,不過一般建議 加上,這樣,也可以增加代碼的健壯性;
匿名命名空間
對于命名空間,相信大家都還是蠻熟悉的,尤其是using namespace std這段,可謂是行云流水呀!這這個使用了std的命名空間;
拋磚引玉法:static
我們可以看一下static,回顧一下: 用于修飾 class 的數據成員,即所謂“靜態成員”。這種數據成員的生存期大于 class 的對象(實例/instance)。靜態數據成員是每個 class 有一份,普通數據成員是每個 instance 有一份,因此也分別叫做 class variable 和 instance variable。static類成員不像普通的類數據成員,static類數據成員獨立于一切類對象處在。static類數據成員是與類關聯的,但不與該類定義的對象有任何關系。即static不會像普通類數據成員一樣每一個類對象都有一份,全部類對象是共享一個static類成員的。例如A類對象修改了static成員為1,那么B對象對應的static類對象成員的值也會是1。
匿名的空間是C++用于替代使用static定義作用域為本編譯單元的全局函數或全局變量的一種新的替代方式,匿名空間與命名的命名空間一樣可以嵌套。由于匿名命名空間沒有命名空間的名字,所以也無法在其它的編譯單元內通過extern聲明該變量,于是該變量自然也只在本編譯單元內可見
? ------來源互聯網
我們看一下例子;
案例三
#include?using?namespace?std;namespace?{????int?num?=?10;}namespace?test{????namespace?????{????????int?num?=?20;????}????void?Print()????{????????cout<
結果:
root@iZuf67on1pthsuih96udyfZ:~/C++/Net_C++/Lab_tt#?./test_________________________test::maintest:num:20num:10_________________________test::Printtest:num:20num:10
相對于static來說,使用匿名空間的好處是: 1.對于一組多個標識符函數只需要使用一個匿名空間來聲明,不需要多次輸入static。
2.可以嵌套。這樣可以在不同命名空間中使用多個同名的標識符。