C++中那些不常用的关键字
2013-11-22 11:02
211 查看
C++有很多关键字,比如if、else、for、continue、break这类常用关键字。还有一些使用不是很频繁的关键字,容易被忘记,这里总结一下,对于笔试面试也许会有帮助。
1、explicit
这个关键字对于好的代码是必要的。
使用explicit关键字,将构造函数声明为显式构造函数,以防止隐式的类型转换。
接受一个实参的构造函数,实际上定义了转换为此类类型的隐式转换机制,可称为转换构造函数。(见C++ Primer 5)。在上述代码中,将string 类型的对象转换为Test类对象。即,在需要使用Test的地方,可以使用string来代替,这种转换是由编译器自动执行的。
上述代码中,使用加运算,将str对象隐式转换为Test类型。值得注意的是,编译器只会自动执行一步类型转换,比如a+"Hello"就会编译错误。
关键字explicit可以防止编译器自动执行这种隐式类型转换。因此,上述代码a+str编译会报错。可以显式的使用转换构造函数,使用a+Test(str)或者a+static_cast<Test>(str)。
explicit只对一个实参的构造函数有效。需要多个实参的构造函数不能用于执行隐式转换,所以无须指定为explicit。
只能在类中声明的时候使用explicit关键字,在类外不能使用。
除非有明显的理由需要定义隐式转换,否则,单参数构造函数应该声明为explicit,可以避免错误。
在C++标准库中,接受一个容量参数的vector构造函数,是explicit的。
在C++11新标准中,还引入了显式类型转换运算符(explicit conversion operator)。可以将explicit关键字用于类型转换运算符,详情参见C++ Primer 5。
2、export
export关键字是一个很少被使用的关键字。它用于模板函数。在模板函数的定义时,加上export关键字,用于指明给定的定义可能会需要在其它文件中产生实例化,避免编译器为每个文件中的模板产生实例。
在一个程序中,一个模板只能定义为export一次。
一般是在函数模板的定义时使用。对于类模板,在类实现文件中使用。
export关键字不是一个好的关键字,应当避免使用。在最新的C++11标准中,已经取消了该关键字。
3、goto
goto关键字和语句一起使用,称为goto语句(goto statement),用于从该语句无条件跳转到同一函数内的另一条语句。
语法形式为goto label; label用于标识一条语句,称为带标签的语句(labeled statement),这是一种特殊的语句,定义方式为标签名后跟一个冒号。比如:
在C++中,标签语句有多种,比如case语句,case即为标签,它们一起称为case标签。public、priavte、protected也是标签,称为访问标签(access label)。虽然都是标签,但是它们不能混用。
goto语句使得程序的逻辑变的难以控制,增加了调试难度,应当避免使用。
4、mutable
mutable是可变的意思,用于声明类的数据成员,称为可变数据成员。使用mutable修饰的类数据成员,即使在const成员函数内部,也可修改其值。
5、volatile
该单词的意思是易变的,不稳定的。它的作用是,作为指令关键字,确保本指令不会被编译器优化而省略,要求每次直接读值。比如,
在并行的程序设计中,这种赋值可能出现意想不到的结果,x的值可能在两次赋值语句之间发生了变化,使用volatile关键字,指定编译器不作此优化,每次用到该变量时,都需要去寄存器或内存中读取该值。
参考:
C++ Primer 第五版
C++ Primer 第四版
http://en.cppreference.com/w/cpp/keyword
——The End——
1、explicit
这个关键字对于好的代码是必要的。
使用explicit关键字,将构造函数声明为显式构造函数,以防止隐式的类型转换。
class Test { public: explicit Test(const std::string& s){} Test operator+(Test&){} };
接受一个实参的构造函数,实际上定义了转换为此类类型的隐式转换机制,可称为转换构造函数。(见C++ Primer 5)。在上述代码中,将string 类型的对象转换为Test类对象。即,在需要使用Test的地方,可以使用string来代替,这种转换是由编译器自动执行的。
Test a; string str="hello"; a+str;
上述代码中,使用加运算,将str对象隐式转换为Test类型。值得注意的是,编译器只会自动执行一步类型转换,比如a+"Hello"就会编译错误。
关键字explicit可以防止编译器自动执行这种隐式类型转换。因此,上述代码a+str编译会报错。可以显式的使用转换构造函数,使用a+Test(str)或者a+static_cast<Test>(str)。
explicit只对一个实参的构造函数有效。需要多个实参的构造函数不能用于执行隐式转换,所以无须指定为explicit。
只能在类中声明的时候使用explicit关键字,在类外不能使用。
除非有明显的理由需要定义隐式转换,否则,单参数构造函数应该声明为explicit,可以避免错误。
在C++标准库中,接受一个容量参数的vector构造函数,是explicit的。
在C++11新标准中,还引入了显式类型转换运算符(explicit conversion operator)。可以将explicit关键字用于类型转换运算符,详情参见C++ Primer 5。
2、export
export关键字是一个很少被使用的关键字。它用于模板函数。在模板函数的定义时,加上export关键字,用于指明给定的定义可能会需要在其它文件中产生实例化,避免编译器为每个文件中的模板产生实例。
在一个程序中,一个模板只能定义为export一次。
一般是在函数模板的定义时使用。对于类模板,在类实现文件中使用。
export关键字不是一个好的关键字,应当避免使用。在最新的C++11标准中,已经取消了该关键字。
3、goto
goto关键字和语句一起使用,称为goto语句(goto statement),用于从该语句无条件跳转到同一函数内的另一条语句。
语法形式为goto label; label用于标识一条语句,称为带标签的语句(labeled statement),这是一种特殊的语句,定义方式为标签名后跟一个冒号。比如:
int x=0; goto end; x=10; end: cout<<x<<endl;上述代码的输出结果为0,goto语句和标签语句之间的代码不执行。
在C++中,标签语句有多种,比如case语句,case即为标签,它们一起称为case标签。public、priavte、protected也是标签,称为访问标签(access label)。虽然都是标签,但是它们不能混用。
goto语句使得程序的逻辑变的难以控制,增加了调试难度,应当避免使用。
4、mutable
mutable是可变的意思,用于声明类的数据成员,称为可变数据成员。使用mutable修饰的类数据成员,即使在const成员函数内部,也可修改其值。
5、volatile
该单词的意思是易变的,不稳定的。它的作用是,作为指令关键字,确保本指令不会被编译器优化而省略,要求每次直接读值。比如,
int x=10; int a=x; int b=x;编译器在编译时发现,x的值在对a赋值语句和对b赋值语句之间未发生变化,由于在执行对a赋值语句的时候已经取出了x值,在对b赋值时,编译器直接将x值赋给b,而不是去寄存器或内存中再次读取,这是编译器的优化操作。
在并行的程序设计中,这种赋值可能出现意想不到的结果,x的值可能在两次赋值语句之间发生了变化,使用volatile关键字,指定编译器不作此优化,每次用到该变量时,都需要去寄存器或内存中读取该值。
参考:
C++ Primer 第五版
C++ Primer 第四版
http://en.cppreference.com/w/cpp/keyword
——The End——
相关文章推荐
- C++中的几个不常用关键字
- c++中不常用的关键字
- C++中四种常用的强制转换关键字
- C++那些细节--static关键字
- C++那些细节--extern关键字&&全局变量定义问题
- C++中几个比较不常用的关键字
- 复习C++中的几个不常用关键字
- C++中几个比较不常用的关键字
- 深入分析C++中几个最不常用的关键字
- c/c++常用的几个关键字总结
- C++中几个比较不常用的关键字(转)
- C++不常用关键字(__leave)
- C语言32个关键字总结以及C++几个常用关键字
- <C/C++基础> 常用关键字总结
- C++几个常用的关键字
- C++那些细节--inline关键字
- C++不常用关键字(__leave)
- C++那些细节--typedef关键字
- C++中几个比较不常用的关键字
- C++中不常用关键字