c++中explicit與mutable關鍵字的深入探究

今天說一說c++裡面的兩個關鍵字explicit和mutable。

1. explicit關鍵字

在寫c++標準輸入輸出相關文章,查看iostream實現代碼的時候,經常看到構造函數前面帶有explicit關鍵字,那麼它到底有什麼作用呢。

explicit用來防止由構造函數定義的隱式轉換,先看這樣一段代碼:

#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;
}

聲明一個隻有一個int類型私有成員變量的類,這個時候沒有使用explicit關鍵字,那麼可以直接使用class Base base = 5;來給成員變量賦值,這也就算瞭,就當他是在構造瞭,但是到瞭base = 6這一行代碼,就很離譜瞭,沒有調用任何set函數,直接就改變瞭私有成員的值,這就相當於,你自己房子裡面放的錢,別人可以隔墻修改你的錢的數量,想想看,你有10000塊錢放傢裡,有個人手指一點,錢變成100瞭,是不是很可怕。

但如果在構造函數前面加一個explicit關鍵字,那麼代碼就不能再這樣寫啦,編譯會報錯,如下:

//構造函數前面加explicit
explicit Base(int p_a){
  a = p_a;}

報錯內容類似這樣的:test.cpp:19:14: error: conversion from ‘int’ to non-scalar type ‘Base’ requested,這樣就避免瞭別人隔墻修改你傢錢的數量啦。

那麼為什麼explicit可以起到這個作用呢,在沒有聲明該關鍵字之前,編譯器根據當前的定義和構造函數,在編譯的時候做瞭一個隱式的類型轉換,但是當編譯器發現瞭explicit這個關鍵字之後,就不再做這個隱式轉換,這個時候等號兩邊的值類型很明顯就不一樣,當然會報編譯錯誤啦。

總結:explicit告訴別人,不允許隔墻修改我傢錢的數量,你要修改的話,必須進到屋子裡才行。

2. mutable關鍵字

mutable用於類的非靜態和非常量數據成員,一般類的成員函數被聲明為const,就表示不會修改類的數據成員,但如果要在常成員函數中修改類的非靜態和非常量數據成員,則可以使用mutable修飾該數據成員,如下:

#include <iostream>

class demo
{
public:
int getCnt() const
{
	m_nCount++;
	return m_nCount;
}

private:
	int m_nCount;
};

int main()
{
	return 0;
}

編譯會報錯:test.cpp:13: 錯誤: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類型前面加一個mutable關鍵字,編譯就通過瞭。

總結:mutable允許你在一個固定不變的房子裡面放置某些可變的物件。

到此這篇關於c++中explicit與mutable關鍵字的文章就介紹到這瞭,更多相關c++ explicit與mutable關鍵字內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: