1. 程式人生 > >成員函式後面加const,沒有const,以及使用的區別

成員函式後面加const,沒有const,以及使用的區別

函式後面加const

編譯器會自動給每一個函式加一個this指標。在一個類的函式後面加上const後,就表明這個函式是不能改變類的成員變數的(加了mutable修飾的除外,後面有講)。實際上,也就是對這個this指標加上了const修飾。

#include <iostream>

using namespace std;

class CTest
{
public:
	void show() const
	{
		cout << "const" << endl;
	}

	void show()
	{
		cout << "normal" << endl;
	}
};

int main()
{
	CTest a;
	a.show();

	const CTest b;
	b.show();

	system("pause");
	return 0;
}

顯示結果:normal

                const

a物件將呼叫普通show(),b物件將呼叫show() const。

如果註釋掉 void show() const 該成員函式,b.show()將報錯。

如果註釋掉void show(),程式可以正常執行,因為a.show()呼叫時,會將其this指標上加const

mutable關鍵字

關鍵字mutable是C++中一個不常用的關鍵字,他只能用於類的非靜態和非常量資料成員。

如果一個類的成員函式被宣告為const型別,表示該函式不會改變物件的狀態,也就是該函式不會修改類的非靜態資料成員。但是有些時候需要在該類函式中對類的資料成員進行賦值,這個時候就需要用到mutable關鍵字了。

class CTest
{
public:

	bool GetData() const
	{
		m_n1++;
		return m_b2;
	}
private:
	mutable int  m_n1;
	bool m_b2;
};

如果m_nA前不加mutable,編譯將報錯 error C2166: l-value specifies const object (error C2166: 左值指定 const 物件)

相關推薦

成員函式後面const沒有const以及使用的區別

函式後面加const編譯器會自動給每一個函式加一個this指標。在一個類的函式後面加上const後,就表明這個函式是不能改變類的成員變數的(加了mutable修飾的除外,後面有講)。實際上,也就是對這個this指標加上了const修飾。#include <iostrea

c++成員函式後面一個冒號的含義

轉載自:https://zhidao.baidu.com/question/2010930169328038188.html 冒號後面跟的是賦值,這種寫法是C++的特性。 A( int aa, int bb ):a(aa),b(bb) { } 相當於 A( int aa,

C++函式後面const

非靜態成員函式後面加const(加到非成員函式或靜態成員後面會產生編譯錯誤),表示成員函式隱含傳入的this指標為const指標,決定了在該成員函式中,任意修改它所在的類的成員的操作都是不允許的(因為隱含了對this指標的const引用);唯一的例外是對於mutable修飾的成員。加了const

C\C++中函式後面const

c++ 在函式後加const的意義:    我們定義的類的成員函式中,常常有一些成員函式不改變類的資料成員,也就是說,這些函式是"只讀"函式,而有一些函式要修改類資料成員的值。如果把不改變資料成員的函式都加上const關鍵字進行標識,顯然,可提高程式的可讀性。其實,它還能提高程式的可靠性,

C\C++中函式後面const修飾

        我們定義的類的成員函式中,常常有一些成員函式不改變類的資料成員,也就是說,這些函式是"只讀"函式,而有一些函式要修改類資料成員的值。如果把不改變資料成員的函式都加上const關鍵字進行標識,顯然,可提高程式的可讀性。其實,它還能提高程式的可靠性,已定義成con

c++類成員函式後邊const是為什麼?

時間是讓人猝不及防的東西,晴是有風陰時有雨,爭不過朝夕,又念著往昔,偷走了青絲卻留住一個你   #include <iostream> #include <string> using namespace std; class Test { pub

C++函式後面const修飾

給隱含的this指標加const,表示這個this指向的東西是const的,也就是說這個函式中無法改動資料成員了。const是一種保證,告訴你這個成員不會改變物件的狀態。 宣告一個成員函式的時候用const關鍵字是用來說明這個函式是 “只讀(read-only

C\C++學習--函式後面const

https://blog.csdn.net/smf0504/article/details/52311207c++ 在函式後加const的意義:    我們定義的類的成員函式中,常常有一些成員函式不改變類的資料成員,也就是說,這些函式是"只讀"函式,而有一些函式要修改類資料成

建構函式後面冒號這傻逼玩意有病吧

簡單的講:冒號後面跟的是賦值,這種寫法是C++的特性。這麻痺特性有毛病。。。A( int aa, int bb ):a(aa),b(bb) { } 相當於 A( int aa, int bb ) { a=aa; b=bb; }   來一段經典程式碼: #include &l

static成員函式不能被宣告為const virtual volatile 原因

1.virtual與靜態函式 C++中,靜態成員函式不能被宣告為virtual函式。 例如,下面的程式會編譯失敗。 #include<iostream> class Test { public: // 編譯錯誤:static成員函式

C++子類的建構函式後面:冒號的作用

在C++類的建構函式中經常會看到如下格式的寫法: MyWindow::MyWindow(QWidget* parent , Qt::WindowFlags flag) : QMainWindow(pa

< C++ > initializer list 初始化列表(建構函式後面個冒號的解釋)

Keypoint : 呼叫父類的建構函式(一般為有參建構函式),初始化類中的成員。 C++ primer 5th edition: Remember When creating an object of a derived class, a program first

函式後面throw關鍵字的含義

1、對throw的說明 C++函式後面後加關鍵字throw(something)限制,是對這個函式的異常安全性作出限制。 舉例及解釋如下: void fun() throw() 表示fun不允許丟擲任何異常,即fun是異常安全的。 void fun() throw(...)

【C++】C++成員函式後面跟冒號冒號

/* node class definition*/ class Node { public: int data; // data Node *parent; Node *left; N

svn安裝好了沒有圖標沒有提交和更新

svn解決方案,當時svn剛裝好,最後重啟了一下,或者退出重啟,本文出自 “總結,學習,在總結” 博客,請務必保留此出處http://593380505.blog.51cto.com/12813864/1924961svn安裝好了,沒有圖標,沒有提交,和更新

C# 學習之接口(寫給自己沒有權威歡迎糾正)

教程 pub oid 沒有 命名 自己 特性 face 但是 重新學習了C#的三大特性,發現接口一直沒有使用,都快忘了,廢話不說,這裏沒有代碼,主要是描述給我自己看的(主要是網上的教程都是W3的,沒有什麽口語化的描述) 1、 接口是需要實例的,在使用的時候一定要實例  

非歸檔模式沒有備份直接拔電導致Undo損壞

ORACLE undo 非歸檔模式,沒有備份,直接拔電導致Undo損壞啟動數據庫,檢查故障信息SQL> conn / as sysdbaSQL> startup pfile=‘ ‘;報錯,ORA-03113:end-of-file on communucation channel查看ale

成員函式的過載、覆蓋和隱藏(遮蔽)的區別

a.成員函式被過載的特徵: (1)相同的範圍(在同一個類中); (2)函式名字相同; (3)引數不同; (4)virtual 關鍵字可有可無。 b.覆蓋是指派生類函式覆蓋基類函式,特徵是: (1)不同的範圍(分別位於派生類與基類); (2)函式名字相同;

用layui修改表單select值後沒有變沒有反應解決方案

解決方案:  $("#admin_user_id").prepend("<option value='0'>--請選擇服務人員--</option>"); #admin_

自己才是最大的敵人沒有最好只有更好。

1 測試驅動開發模式 1.1 重新定義“測試” 這是一張影響圖: 普通箭頭表示當第一個節點增長時,第二個節點也會做相應的增長。帶圓圈的箭頭表示當第一個節點增長時,第二個節點也會做相應的減少。 當壓力越大時,所做的測試就會越少。測試越少,犯的錯就會越多,就會感到更大的