c++ explicit關鍵字_聊一聊 C++的特性 explicit 匿名空間

8cdb84ec0eef7bc77a72d8d7726859c6.png

聊一聊 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.可以嵌套。這樣可以在不同命名空間中使用多個同名的標識符。



本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/275921.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/275921.shtml
英文地址,請注明出處:http://en.pswp.cn/news/275921.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

谷歌瀏覽器那些有趣的隱藏功能

大家好&#xff0c;我是若川&#xff08;點這里加我微信 ruochuan12&#xff0c;長期交流學習&#xff09;。今天推薦一篇實用文章。文末有抽獎。點擊下方卡片關注我、加個星標&#xff0c;或者查看源碼等系列文章。學習源碼整體架構系列、年度總結、JS基礎系列很多小伙伴說還是…

AppDelegate的模塊化+瘦身

前言 關于iOS的模塊化&#xff0c;要追溯到16年接觸的BeeHive了&#xff0c;BeeHive將功能模塊化&#xff0c;以module的形式進行構建&#xff0c;以performSelector&#xff1a;的形式進行module的事件響應&#xff0c;以protocol的形式進行module間的通信。可以說思路非常清晰…

yii mysql_Yii2框架操作數據庫的方法分析【以mysql為例】

本文實例講述了Yii2框架操作數據庫的方法。分享給大家供大家參考&#xff0c;具體如下&#xff1a;準備數據庫DROP TABLE IF EXISTS pre_user;CREATE TABLE pre_user(id int(11) AUTO_INCREMENT PRIMARY KEY,username varchar(255) NOT NULL,password varchar(32) NOT NULL DEF…

C++接口注意

1. 用Record接口&#xff0c;要注意 Packed的區別 2. cdecl和stdcall的區別 3. C導出的函數建議用C格式stdcall導出&#xff0c;使用Def文件定義名稱 4. 用VS寫的API dll要注意是否引用了MFC的DLL&#xff0c;否則會使LoadLibrary失敗&#xff0c;并GetLastError后返回14001 Ap…

Vue 3.1.0 的 beta 版發布

大家好&#xff0c;我是若川&#xff08;點這里加我微信 ruochuan12&#xff0c;長期交流學習&#xff09;。昨晚尤大視頻號直播說到vue 3.1.0 beta版發布了&#xff0c;今天分享這篇文章。也有小伙伴可能注意到了昨晚我一直在送禮物。點擊下方卡片關注我、加個星標&#xff0c…

設計模式練習_設計練習是邪惡的

設計模式練習It was the final round of interviews. Or, so the candidate thought.這是采訪的最后一輪。 或者&#xff0c;所以候選人認為。 She’d spent all day interviewing in our office. As the final interviewer, I walked her out the building. She seemed confi…

morningcat2018 LearningDocs

2019獨角獸企業重金招聘Python工程師標準>>> LearningDocs 學習資料與文檔 JCP&#xff08;Java Community Process &#xff0c;Java社區進程 &#xff09; https://www.jcp.org/en/home/index JSR&#xff08;Java Specification Requests&#xff0c;Java規范請求…

firefox下可惡的value

前幾天做項目 遇到這樣一個情況 document.getElementById("txtTest").value "111"; 這條語句在ff下和ie下都是好用的 但是用開發工具看html代碼 ie下顯示正常 ff下顯示的卻是修改之前的(實際上已經修改了&#xff0c;只是html沒有修改過來) 用js修改input…

據說 99% 的人不知道 vue-devtools 還能直接打開對應組件文件?本文原理揭秘

1. 前言你好&#xff0c;我是若川[1]&#xff0c;微信搜索「若川視野」關注我&#xff0c;專注前端技術分享&#xff0c;一個愿景是幫助5年內前端開闊視野走向前列的公眾號。歡迎加我微信ruochuan12&#xff0c;長期交流學習。這是學習源碼整體架構系列 之 launch-editor 源碼&…

mysql 存儲 事務_MYSQL 可以在存儲過程里實現事務控制嗎

展開全部6.7 MySQL 事務與鎖定命令6.7.1 BEGIN/COMMIT/ROLLBACK 句法缺省的&#xff0c;MySQL 運行在 autocommit 模式。這就意味著&#xff0c;當你執行完一e69da5e887aa62616964757a686964616f31333361326265個更新時&#xff0c;MySQL 將立刻將更新存儲到磁盤上。如果你使用…

如何忽略證書繼續訪問_前5個最容易被忽視的可訪問性問題

如何忽略證書繼續訪問Accessibility is quickly becoming one of the most important aspects of the way we use the web, if not the most important. Just between 2017 and 2018, the number of federal court cases regarding web accessibility nearly tripled, signifyi…

《認清C++語言》のrandom_shuffle()和transform()算法

1&#xff09;STL中的函數random_shuffle()用來對一個元素序列進行重新排序&#xff08;隨機的&#xff09;&#xff0c;函數原型如下&#xff1a; template<class RandomAccessIterator> void random_shuffle( RandomAccessIterator _First, //指向序列首元素的迭代器 R…

作為前端開發,如何高效學習 TypeScript

大家好&#xff0c;我是若川。有朋友跟我說最近面試前端候選人&#xff0c;問到關于 JavaScript 的一些少見誤區問題&#xff0c;候選人很多都沒回答上來&#xff0c;他很詫異&#xff0c;一個從國際大廠出來的面試者&#xff0c;竟然對 JavaScript 的一些誤區問題都不了解。他…

figma下載_對于這10家公司,Figma是邁向新高度的起點

figma下載Hey everyone! In this post, we are highlighting 10 companies for which the use of Figma has become the starting point on the path to new heights. These are the use cases of problems and their solutions, where Figma played a decisive role.嘿大家&am…

mysql查詢條件為or_使用mysql查詢where條件里的or和and

為什么要著重講這塊內容呢?因為好多小伙伴都會混淆&#xff0c;要不就是不知道怎么組合使用&#xff0c;今天就給大家講這部分內容干貨&#xff0c;讓大家半分鐘看懂。AND、OR運算符的組合使用在WHERE子句中&#xff0c;通過AND、OR運算符可以同時連接多個條件&#xff0c;當然…

sql server(常用)

普通用法 //生成 uuid 并轉為小寫 select LOWER(SUBSTRING(uuid,1,8)-SUBSTRING(uuid,10,4)-SUBSTRING(uuid,15,4)-SUBSTRING(uuid,20,4)-SUBSTRING(uuid,25,12)) from (select cast(NEWID() as varchar(36)) as uuid) s //ea52a7bb-a2aa-44b8-be28-5ebc64defcf9//獲取時分秒…

代碼編寫中會遇到的安全性問題

一、常用的攻擊手段 1&#xff0e;腳本注入 漏洞描述&#xff1a; 腳本注入攻擊在通過瀏覽器使用用戶輸入框插入惡意標記或腳本代碼時發生。 如&#xff1a;某個輸入框允許用戶向數據存儲中插入內容&#xff0c;如果將一段js腳本插入其中&#xff0c;則當其他用戶使用或瀏覽此數…

TypeScript 原來可以這么香?!

先問一個問題&#xff0c;JavaScript有幾種數據類型&#xff1f;number、string、boolean、null、undefined、symbol、bigint、object其中 bigint 是 ES2020 新增的數據類型&#xff0c;而早在 TS3.2 時便成為 TS 的標準&#xff0c;其實還有好多 ES 標準是 TS 率先提出的&…

java8新特性stream深入解析

2019獨角獸企業重金招聘Python工程師標準>>> 繼續java8源碼的發燒熱&#xff0c;越看越是有充實的感覺。 數據時代下的產物 Java順應時代的發展推出的高效處理大量數據能力的api&#xff0c;它專注于對集合對象進行各種非常便利、高效的聚合操作&#xff0c;借助于同…

mysql內連接的自連接_mysql 內連接、外連接、自連接

一)內連接(等值連接)&#xff1a;查詢客戶姓名&#xff0c;訂單編號&#xff0c;訂單價格---------------------------------------------------select c.name,o.isbn,o.pricefrom customers c inner join orders owhere c.id o.customers_id;-------------------------------…