天天看點

【C++複習一】C++關鍵字

最近在複習C++,首先看的就是關鍵字,因為有一定基礎,就直接略去熟悉的關鍵字了,直接看自己還不熟悉或者根本就沒有用過的。

1、mutable關鍵字

mutable是用來突破const限制的,字面意思就是可變的,意味着即便是在一個const函數中,也是可以修改它的值的

i.e.

class A
{
public:
	inline void out() const{cout<<"output for test!";}
};
           

這個函數沒有改變任何值,是以呢聲明為const,但是如果現在我們有一個新的需求,希望能夠計算出使用out函數的次數;首先想到的方法肯定是聲明一個成員變量在out中自增。

但是函數式const的,問題就來了,該怎麼辦呢,其實很簡單,隻要将這個成員變量聲明為mutable就行了

class A
{
private:
	mutable int count;
public:
	inline void out() const{cout<<"output for test!";count++;}
};
           

2、operator關鍵字 這個還是比較熟悉的,因為經常用,但是經常會有問題,是以也來說一下

return-type class-name::operator#(parameter-list) {
    ...
  }
  return-type operator#(parameter-list) {
    ...
  }
           

其實是用在重載操作符的,上面的文法中,#号表示被重載的操作符,加入是在類中,那麼應該指定類名。一員操作符參數清單應該為空,二進制的話,在operator右邊的應該當做函數的參數,左邊的值被當做this通過。對于不屬于重載函數的operator函數,在左邊的被作為第一操作數,在右邊的被作為第二操作數。

3、typename關鍵字 這個用的還比較多的,泛型程式設計,寫模闆類或者模闆函數的時候會用到,用來代替類型名或者class的

4、asm 這個就比較另類了,貌似我也沒用到過,它是用來在C++程式中插入一段彙編代碼的,但是各種編譯器支援的格式是不太一樣的。,例如

asm {
      instruction-sequence
    }
or
    asm( instruction );
           

5、extern關鍵字 可以置于變量和函數前,告訴編譯器此變量或者函數在其他檔案或者子產品中定義如extern int g_int;嗨喲衶用法就是extern C fun(),告訴編譯器編譯時按照C的方式來編譯這個函數,因為C++編譯的話會把這個函數名變得面目全非,這就跟C++的重載機制有關了

6、explicit

當構造函數被指定為explicit時候,将不會把構造函數自動作為轉換構造函數。。是以他是隻對構造函數有用,用來抑制隐式轉換。

class A
{
private:
	int count;
public:
         A(int a){count=a;}

};

void fun(A){}

int main
{
    fun(1);
}
           

這時候就會發生隐式轉化,有時候我們不需要這種轉會,應當在構造函數前面加上explicit關鍵字

explicit  A(int a){count=a;}
           

7、auto

其特點是當執行流程進入該語句塊的時候執行初始化操作,僅在語句塊内部使用。C語言中提供了存儲說明符auto,register,extern,static說明的四種存儲類别。四種存儲類别說明符有兩種存儲期:自動存儲期和靜态存儲期。其中auto和register對應自動存儲期。具有自動存儲期的變量在進入聲明該變量的程式塊時被建立,它在該程式塊活動時存在,退出該程式塊時撤銷。不過所有的非全局變量的預設假定為auto。但是在VC2010中,它有了新的含義,他可以對類型進行推斷,例如

auto a=100,那麼a就是int類型的。

8、namespace關鍵字。命名空間

這個用的比較多,有必要作個記錄,防止以後忘記

部分内容參考了百度百科

// one.h
char func(char);
class String { ... };
// somelib.h
class String { ... };
           

這兩個頭檔案是不能包含在一個程式中的,因為string會發生沖突。所謂命名空間,就是将程式庫名稱封裝起來的技術,就好像聲明了什麼什麼東西是我們家的一樣,别人要想用必須來借。

來自百度百科的執行個體,基本上闡述了namespace的用法和意義。

//DISPLAY Namespace Demonstration
#include <iostream>
using namespace std;
namespace savitch1
{
void greeting( );
}
namespace savitch2
{
void greeting( );
}
void big_greeting( );
int main( )
{
{
using namespace savitch2; //使用savictch2、std、全局三個命名空間
greeting( );
}
{
using namespace savitch1; //使用savitch1、std、全局三個命名空間
greeting( );
}
big_greeting( ); //使用了std一個标準命名空間
return 0;
}
namespace savitch1
{
void greeting( )
{
cout << "Hello from namespace savitch1.\n";
}
}
namespace savitch2
{
void greeting( )
{
cout << "Greetings from namespace savitch2.\n";
}
}
void big_greeting( )
{
cout << "A Big Global Hello!\n";
}
           

繼續閱讀