日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學(xué)無先后,達者為師

網(wǎng)站首頁 編程語言 正文

C++中using的三種用法舉例詳解_C 語言

作者:wuqiongjin ? 更新時間: 2023-04-03 編程語言

1. using聲明(引入單個名稱)

using聲明是將命名空間中某個名字單獨引入到當前作用域。這使得我們在當前作用域下可以直接使用該名字而無需使用作用域限定符::。

using std::string;
string s = "123";

using聲明可以改變派生類對父類成員的訪問控制。

class Base{
protected:
    int bn1;
    int bn2;
};
 
class Derived: private Base{	//私有繼承
public:
    using Base::bn1;	//在當前作用域中引入了父類的保護成員, 在當前作用域中可以訪問
};
 
class DerivedAgain: public Derived{	//在Derived的子類中仍然可以訪問bn1
};
 
int main(){
    Derived d;
    DerivedAgain da; 
    d.bn1 = 1;
    d.bn2 = 2;   //error, 'bn2' is a private member of 'Base'
    da.bn1 = 3;  //ok
    std::cout<<d.bn1<<std::endl;
    return 0;
}

盡管Derived是Base的私有繼承,但是通過using聲明父類的成員,我們就可以在Derived類以及其后續(xù)派生類中使用了。

2. using指示(引入命名空間)

using指示就是將一個命名空間中的所有名字全部引入到當前作用域(將命名空間在當前作用域展開)??赡軙嬖诿麤_突的問題。

using namespace std;	//我們常用的std命名空間展開

3. 類型重定義(替代typedef)

語法:

using alias = typename;//使用別名去替代原始類型(重命名)

在C++11中,我們可以使用這樣的語法來替代typedef的功能了。

using ULL = unsigned long long;		//typedef unsigned long long ULL;
using func = void(*)(int, int);		//typedef void(*func)(int, int);

在Effective Modern C++中的條款9說明了, 使用using替代typedef。

typedef存在一些限制。

當我們想實現(xiàn)一個這樣的模板: 將一個int映射到任意類型的模板。類似于下面的功能:

typedef std::map<int, int> mapIntInt;
typedef std::map<int, bool> mapIntBool;
typedef std::map<int, std::string> mapIntString;
//...

在C++98/03中,我們必須這樣寫才能實現(xiàn):

template <class Val>
struct mapInt{
    typedef std::map<int, Val> type;
};

int main(){
    mapInt<int>::type imap;		//將int映射到int的
    mapInt<bool>::type bmap;	//將int映射到bool的
    mapInt<std::string>::type smap;	//將int映射到string的
    return 0;
}

在C++11中,我們可以直接使用using重定義模板。

template <class Val>
using mapInt = std::map<int, Val>;

int main(){
    mapInt<int> imap;
    mapInt<bool> bmap;
    mapInt<std::string> smap;
    return 0;
}

總結(jié)

原文鏈接:https://blog.csdn.net/weixin_51696091/article/details/127976813

欄目分類
最近更新