聊一聊 C++的特性 explicit && 匿名空間

聊一聊 C++的特性 explicit && 匿名空間


explicit關鍵字

首先看一下explicit的作用:explicit 是避免構造函數的參數自動轉換爲類對象的標識符,平時代碼中並不是經常用到,但是,有時候就是因爲這個,會造成一定的BUG出現,而我們卻苦苦查詢不到問題;

下面看一個例子來說明下:

案例一

test.cpp

#include <iostream>

using namespace std;

class Test
{
public:
    Test(int a)
    {
        _num = a;
    }
    int getNum()
    {
        return _num;
    }
private:
    int _num;
};

int main()
{
    Test t = 'c';
    cout<<t.getNum()<<endl;
    return 0;
}

我們看下結果:

root@iZuf67on1pthsuih96udyfZ:~/C++/Net_C++/Lab_tt# g++ test.cpp -o test
root@iZuf67on1pthsuih96udyfZ:~/C++/Net_C++/Lab_tt# ./test 
99

我們會發現,程序在內部就自動幫我們進行了轉換,假設我們本來是想得到是字符‘c’,但是被莫名的修改爲了99,其實在一些程序中,我們沒有太關注這些自動轉換的狀態,但是我們閱讀一些開源代碼庫的時候,很多都會避免這類事情發生,而使用關鍵字explicit就是武器;

來看下構造函數使用explicit的效果:

案例二

#include <iostream>

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<<t.getNum()<<endl;
    return 0;
}

我們編譯一下:

root@iZuf67on1pthsuih96udyfZ:~/C++/Net_C++/Lab_tt# g++ test.cpp -o test
test.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 <iostream>

using namespace std;

namespace 
{
    int num = 10;
}

namespace test
{
    namespace 
    {
        int num = 20;
    }
    void Print()
    {
        cout<<"_________________________"<<endl;
        cout<<"test::Print"<<endl;
        cout<<"test:num:"<<test::num<<endl;
        cout<<"num:"<<::num<<endl;
    }
}

int main()
{
    cout<<"_________________________"<<endl;
    cout<<"test::main"<<endl;
    cout<<"test:num:"<<test::num<<endl;
    cout<<"num:"<<::num<<endl;
    test::Print();
    return 0;
}

結果:

root@iZuf67on1pthsuih96udyfZ:~/C++/Net_C++/Lab_tt# ./test
_________________________
test::main
test:num:20
num:10
_________________________
test::Print
test:num:20
num:10

相對於static來說,使用匿名空間的好處是:
1.對於一組多個標識符函數只需要使用一個匿名空間來聲明,不需要多次輸入static。

2.可以嵌套。這樣可以在不同命名空間中使用多個同名的標識符。


想了解學習更多C++後臺服務器方面的知識,請關注:
微信公衆號:CPP後臺服務器開發


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