c++中explicit與mutable關(guān)鍵字的深入探究
今天說(shuō)一說(shuō)c++里面的兩個(gè)關(guān)鍵字explicit和mutable。
1. explicit關(guān)鍵字
在寫(xiě)c++標(biāo)準(zhǔn)輸入輸出相關(guān)文章,查看iostream實(shí)現(xiàn)代碼的時(shí)候,經(jīng)??吹綐?gòu)造函數(shù)前面帶有explicit關(guān)鍵字,那么它到底有什么作用呢。
explicit用來(lái)防止由構(gòu)造函數(shù)定義的隱式轉(zhuǎn)換,先看這樣一段代碼:
#include <iostream> class Base { private: int a; public: Base(int p_a){ a = p_a;} ~Base(){} void print() { std::cout << "a=" << a << std::endl; } }; int main() { Base base = 5; base.print(); base = 6; base.print(); return 0; }
聲明一個(gè)只有一個(gè)int類(lèi)型私有成員變量的類(lèi),這個(gè)時(shí)候沒(méi)有使用explicit關(guān)鍵字,那么可以直接使用class Base base = 5;來(lái)給成員變量賦值,這也就算了,就當(dāng)他是在構(gòu)造了,但是到了base = 6這一行代碼,就很離譜了,沒(méi)有調(diào)用任何set函數(shù),直接就改變了私有成員的值,這就相當(dāng)于,你自己房子里面放的錢(qián),別人可以隔墻修改你的錢(qián)的數(shù)量,想想看,你有10000塊錢(qián)放家里,有個(gè)人手指一點(diǎn),錢(qián)變成100了,是不是很可怕。
但如果在構(gòu)造函數(shù)前面加一個(gè)explicit關(guān)鍵字,那么代碼就不能再這樣寫(xiě)啦,編譯會(huì)報(bào)錯(cuò),如下:
//構(gòu)造函數(shù)前面加explicit explicit Base(int p_a){ a = p_a;}
報(bào)錯(cuò)內(nèi)容類(lèi)似這樣的:test.cpp:19:14: error: conversion from 'int' to non-scalar type 'Base' requested,這樣就避免了別人隔墻修改你家錢(qián)的數(shù)量啦。
那么為什么explicit可以起到這個(gè)作用呢,在沒(méi)有聲明該關(guān)鍵字之前,編譯器根據(jù)當(dāng)前的定義和構(gòu)造函數(shù),在編譯的時(shí)候做了一個(gè)隱式的類(lèi)型轉(zhuǎn)換,但是當(dāng)編譯器發(fā)現(xiàn)了explicit這個(gè)關(guān)鍵字之后,就不再做這個(gè)隱式轉(zhuǎn)換,這個(gè)時(shí)候等號(hào)兩邊的值類(lèi)型很明顯就不一樣,當(dāng)然會(huì)報(bào)編譯錯(cuò)誤啦。
總結(jié):explicit告訴別人,不允許隔墻修改我家錢(qián)的數(shù)量,你要修改的話(huà),必須進(jìn)到屋子里才行。
2. mutable關(guān)鍵字
mutable用于類(lèi)的非靜態(tài)和非常量數(shù)據(jù)成員,一般類(lèi)的成員函數(shù)被聲明為const,就表示不會(huì)修改類(lèi)的數(shù)據(jù)成員,但如果要在常成員函數(shù)中修改類(lèi)的非靜態(tài)和非常量數(shù)據(jù)成員,則可以使用mutable修飾該數(shù)據(jù)成員,如下:
#include <iostream> class demo { public: int getCnt() const { m_nCount++; return m_nCount; } private: int m_nCount; }; int main() { return 0; }
編譯會(huì)報(bào)錯(cuò):test.cpp:13: 錯(cuò)誤:increment of data-member ‘demo::m_nCount' in read-only structure
,但如果改為如下代碼:
#include <iostream> class demo { public: int getCnt() const { m_nCount++; return m_nCount; } private: mutable int m_nCount; }; int main() { return 0; }
在int類(lèi)型前面加一個(gè)mutable關(guān)鍵字,編譯就通過(guò)了。
總結(jié):mutable允許你在一個(gè)固定不變的房子里面放置某些可變的物件。
到此這篇關(guān)于c++中explicit與mutable關(guān)鍵字的文章就介紹到這了,更多相關(guān)c++ explicit與mutable關(guān)鍵字內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
c++中priority_queue模擬的實(shí)現(xiàn)
priority_queue是C++標(biāo)準(zhǔn)庫(kù)中的一個(gè)容器適配器,用于實(shí)現(xiàn)優(yōu)先隊(duì)列的數(shù)據(jù)結(jié)構(gòu),本文主要介紹了c++中priority_queue模擬的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2024-09-09淺談使用Rapidxml 庫(kù)遇到的問(wèn)題和分析過(guò)程(分享)
下面小編就為大家?guī)?lái)一篇淺談使用Rapidxml 庫(kù)遇到的問(wèn)題和分析過(guò)程(分享)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-05-05C語(yǔ)言實(shí)現(xiàn)校園導(dǎo)游系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)校園導(dǎo)游系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03最新VScode C/C++ 環(huán)境配置的詳細(xì)教程
這篇文章主要介紹了最新VScode C/C++ 環(huán)境配置的詳細(xì)教程,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-11-11

Linux環(huán)境下段錯(cuò)誤的產(chǎn)生原因及調(diào)試方法小結(jié)