您的位置:首页 > 编程语言 > C语言/C++

C++中那些不常用的关键字

2013-11-22 11:02 211 查看
C++有很多关键字,比如if、else、for、continue、break这类常用关键字。还有一些使用不是很频繁的关键字,容易被忘记,这里总结一下,对于笔试面试也许会有帮助。

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——
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: