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

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

explicit關鍵字

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

下面看一個例子來講明下:bash

案例一服務器

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的效果:ui

案例二spa

#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;
}
複製代碼

咱們編譯一下:scala

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關鍵字,避免了上面異常自動轉換的結果發生;code

建議:咱們編寫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後臺服務器開發====

相關文章
相關標籤/搜索