面试过程中,一些面试官对C++一些特殊关键字很关注;
整理了一些比较有说头的关键字
用来声明构造函数,被声明的构造函数为显示构造函数,不能在隐式转换中使用。
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声明的成员变量,可以在被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声明的变量意味着有可能被某些编译器未知的因素更改,因此编译器不会对其做任何优化操作。
从而可以提供对特殊地址的稳定访问,多用于嵌入式编程中。
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