最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

c++中explicit與mutable關(guān)鍵字的深入探究

 更新時(shí)間:2021年05月10日 09:29:16   作者:cpp加油站  
這篇文章主要給大家介紹了關(guān)于c++中explicit與mutable關(guān)鍵字的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

今天說一說c++里面的兩個(gè)關(guān)鍵字explicit和mutable。

1. explicit關(guān)鍵字

在寫c++標(biāo)準(zhǔn)輸入輸出相關(guān)文章,查看iostream實(shí)現(xiàn)代碼的時(shí)候,經(jīng)??吹綐?gòu)造函數(shù)前面帶有explicit關(guān)鍵字,那么它到底有什么作用呢。

explicit用來防止由構(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類型私有成員變量的類,這個(gè)時(shí)候沒有使用explicit關(guān)鍵字,那么可以直接使用class Base base = 5;來給成員變量賦值,這也就算了,就當(dāng)他是在構(gòu)造了,但是到了base = 6這一行代碼,就很離譜了,沒有調(diào)用任何set函數(shù),直接就改變了私有成員的值,這就相當(dāng)于,你自己房子里面放的錢,別人可以隔墻修改你的錢的數(shù)量,想想看,你有10000塊錢放家里,有個(gè)人手指一點(diǎn),錢變成100了,是不是很可怕。

但如果在構(gòu)造函數(shù)前面加一個(gè)explicit關(guān)鍵字,那么代碼就不能再這樣寫啦,編譯會報(bào)錯(cuò),如下:

//構(gòu)造函數(shù)前面加explicit
explicit Base(int p_a){
  a = p_a;}

報(bào)錯(cuò)內(nèi)容類似這樣的:test.cpp:19:14: error: conversion from 'int' to non-scalar type 'Base' requested,這樣就避免了別人隔墻修改你家錢的數(shù)量啦。

那么為什么explicit可以起到這個(gè)作用呢,在沒有聲明該關(guān)鍵字之前,編譯器根據(jù)當(dāng)前的定義和構(gòu)造函數(shù),在編譯的時(shí)候做了一個(gè)隱式的類型轉(zhuǎn)換,但是當(dāng)編譯器發(fā)現(xiàn)了explicit這個(gè)關(guān)鍵字之后,就不再做這個(gè)隱式轉(zhuǎn)換,這個(gè)時(shí)候等號兩邊的值類型很明顯就不一樣,當(dāng)然會報(bào)編譯錯(cuò)誤啦。

總結(jié):explicit告訴別人,不允許隔墻修改我家錢的數(shù)量,你要修改的話,必須進(jìn)到屋子里才行。

2. mutable關(guān)鍵字

mutable用于類的非靜態(tài)和非常量數(shù)據(jù)成員,一般類的成員函數(shù)被聲明為const,就表示不會修改類的數(shù)據(jù)成員,但如果要在常成員函數(shù)中修改類的非靜態(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;
}

編譯會報(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類型前面加一個(gè)mutable關(guān)鍵字,編譯就通過了。

總結(jié):mutable允許你在一個(gè)固定不變的房子里面放置某些可變的物件。

到此這篇關(guān)于c++中explicit與mutable關(guān)鍵字的文章就介紹到這了,更多相關(guān)c++ explicit與mutable關(guān)鍵字內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語言詳細(xì)講解循環(huán)語句的妙用

    C語言詳細(xì)講解循環(huán)語句的妙用

    C語言循環(huán)控制語句是一個(gè)基于C語言的編程語句,該語句主要有while循環(huán)語句、do-while循環(huán)語句和for循環(huán)語句來實(shí)現(xiàn)循環(huán)結(jié)構(gòu),在循環(huán)過程中還有關(guān)鍵字break、continue、do、break控制中斷繼續(xù)與結(jié)束等操作
    2022-04-04
  • C++段錯(cuò)誤(Segmentation fault)快速定位的解決方法

    C++段錯(cuò)誤(Segmentation fault)快速定位的解決方法

    寫過C++的朋友都知道,有時(shí)候程序編譯通過,并不能代表程序就是對的,在linux下做開發(fā)時(shí),經(jīng)常會遇到跑崩潰的情況,但是在終端只會報(bào)Segmentation fault,如果工程代碼量少,你還能重新debug一下慢慢找,本文給大家介紹了C++段錯(cuò)誤的快速定位,需要的朋友可以參考下
    2024-07-07
  • 淺析內(nèi)存對齊與ANSI C中struct型數(shù)據(jù)的內(nèi)存布局

    淺析內(nèi)存對齊與ANSI C中struct型數(shù)據(jù)的內(nèi)存布局

    當(dāng)在C中定義了一個(gè)結(jié)構(gòu)類型時(shí),它的大小是否等于各字段(field)大小之和?編譯器將如何在內(nèi)存中放置這些字段?ANSI C對結(jié)構(gòu)體的內(nèi)存布局有什么要求?而我們的程序又能否依賴這種布局
    2013-09-09
  • C++深淺拷貝和string類的兩種寫法詳解

    C++深淺拷貝和string類的兩種寫法詳解

    這篇文章主要為大家詳細(xì)介紹了C++深淺拷貝和string類的兩種寫法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • 實(shí)例講解C++設(shè)計(jì)模式編程中State狀態(tài)模式的運(yùn)用場景

    實(shí)例講解C++設(shè)計(jì)模式編程中State狀態(tài)模式的運(yùn)用場景

    這篇文章主要介紹了實(shí)例講解C++設(shè)計(jì)模式編程中State狀態(tài)模式的運(yùn)用場景,文章最后的適用性部分則介紹了一些State模式善于處理的情況,需要的朋友可以參考下
    2016-03-03
  • C++11 并發(fā)指南之std::thread 詳解

    C++11 并發(fā)指南之std::thread 詳解

    這篇文章主要介紹了C++11 并發(fā)指南之std::thread 詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • 簡單了解設(shè)計(jì)模式中的裝飾者模式及C++版代碼實(shí)現(xiàn)

    簡單了解設(shè)計(jì)模式中的裝飾者模式及C++版代碼實(shí)現(xiàn)

    這篇文章主要介紹了簡單了解設(shè)計(jì)模式中的裝飾者模式及C++版代碼實(shí)現(xiàn),ConcreteComponent的引用(指針)也可以達(dá)到修飾的功能,需要的朋友可以參考下
    2016-03-03
  • 解決VC++編譯報(bào)錯(cuò)error C2248的方案

    解決VC++編譯報(bào)錯(cuò)error C2248的方案

    這篇文章主要介紹了解決VC++編譯報(bào)錯(cuò)error C2248的方案的相關(guān)資料,需要的朋友可以參考下
    2015-11-11
  • 關(guān)于C++中虛擬繼承的一些總結(jié)分析

    關(guān)于C++中虛擬繼承的一些總結(jié)分析

    虛擬繼承在一般的應(yīng)用中很少用到,所以也往往被忽視,這也主要是因?yàn)樵贑++中,多重繼承是不推薦的,也并不常用
    2013-09-09
  • C語言實(shí)現(xiàn)電腦關(guān)機(jī)程序

    C語言實(shí)現(xiàn)電腦關(guān)機(jī)程序

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)電腦關(guān)機(jī)程序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-02-02

最新評論

江永县| 新沂市| 汉阴县| 青阳县| 荔浦县| 壤塘县| 沾益县| 静宁县| 台江县| 义乌市| 蚌埠市| 和龙市| 平湖市| 上犹县| 时尚| 上犹县| 赣榆县| 漳平市| 阳朔县| 浦北县| 连平县| 公安县| 乐山市| 济源市| 海伦市| 铁岭县| 汾阳市| 玉山县| 普兰店市| 沿河| 宁安市| 乌什县| 南靖县| 六安市| 闵行区| 拉萨市| 天津市| 滁州市| 金昌市| 安图县| 任丘市|