面試過程中,一些面試官對C++一些特殊關鍵字很關注;
整理了一些比較有說頭的關鍵字
• explicit
用來聲明構造函數,被聲明的構造函數為顯示構造函數,不能在隱式轉換中使用。
C++中一個參數的構造函數或除第一個參數外均有默認值的多參構造函數,有兩個作用:1、構造對象;2、默認且隱式的類型轉換操作符。
1 class foo
2 {
3 public:
4 explicit foo( int a )
5 : _member( a )
6 {}
7
8 int _member;
9 };
10
11 int bar( const foo & f )
12 {
13 return f._member;
14 }
15
16 bar( 1 ); // 失敗, explicit禁止int到foo的隱式(implicit)類型轉換.
17
18 bar( foo( 1 ) ); // 正確, 顯式調用explicit構造函數.
19
20 bar( static_cast<foo>( 1 ) ); // 正確, 通過static_cast調用explicit構造函數.
21
22 bar( foo( 1.0 ) ); // 正確, 顯式調用explicit構造函數, 參數自動從浮點轉換成整型.
• mutable
用來聲明一個成員變量,被mutable聲明的成員變量,可以在被const修飾的成員函數中修改。
mutable不可與const、static同時使用。
1 class foo
2 {
3 public:
4 foo()
5 : _member(0)
6 {}
7
8 void ExChange( int a ) const
9 {
10 _member = a;
11 }
12
13 mutable int _member;
14 }
• volatile
用以聲明一個變量,被volatile聲明的變量意味著有可能被某些編譯器未知的因素更改,因此編譯器不會對其做任何優化操作。
從而可以提供對特殊地址的穩定訪問,多用於嵌入式編程中。
1 void foo()
2 {
3 //volatile int nData = 1;
4 int nData = 1;
5
6 int nData_b = nData;
7 printf("nData = %d\n",nData_b);
8
9 // c++嵌入asm參見:http://asm.sourceforge.net/articles/linasm.html
10 asm("movl $2, -4(%ebp)\n\r"); // 修改變量地址內容
11
12 int nData_a = nData;
13 printf("nData = %d\n",nData_a);
14 }
15
16 使用volatile輸出:
17 nData = 1
18 nData = 2
19
20 不使用volatile輸出為:
21 nData = 1
22 nData = 1
摘自 Gordon-Ma