深入学习c++ 关键词第二部分
头文件 iostream
compl
同于 ~
constexpr
带有constexpr标识的函数的计算工作可以在编译阶段完成(在可以计算出来的情况下)。
如下面代码所示,若没有constexpr则会报错。
#include <iostream>
using namespace std;
constexpr int min(int a, int b)
{
if (a < b)
return a;
else
return b;
}
int main()
{
int m[min(3,5)];
return 0;
}
也就是说,这个关键字可以拓展c++在编译期的能力。
const_cast
(当你使用它时,说明你的程序设计上有问题)
这个关键字用于改变const的不变性。
如去除不变性:
const int i = 1;
int* pi = const_cast<int*>(&i);
*pi = 4;
decltype
类似于auto,decltype的作用也是定义类型。
如:
double a = 3;
auto b = a; //不仅将 b 定义为 a 的类型(double),还将 a 的值赋给 b。
decltype(a) b; //将 b 定义为 a 的类型(double),但未给 b 赋值。
decltype((a)) c = b; //这里 a 的两边有括号,表示将 c 的类型为 a 的引用(double&),即 c 成为 b 的引用。
auto& d = a; //auto的引用方法
decltype与auto一起使用:
template <typename T,typename U>
auto add(T a,U b) -> decltype (a+b)
{
return a+b;
//或return (a+b);
}
即让函数返回值由a+b的类型而定。
也可以只用auto,但是稍有不同(见注释):
template <typename T,typename U>
auto add(T a,U b)
{
return a+b;
//return (a+b);时,则会返回a+b的引用。
}
dynamic_cast
转换具有继承关系的指针或引用,且只能子转父(因为dynamic_cast做安全性检查)。
如:
parent* p = new child;
child* c = dynamic_cast<child*>(p);
在转换失败时,如果转换的是指针,则会返回空指针,如果转换的是引用,则会抛出异常。
enum
enum class a : char{red,green,blue};
class使a成为一个强类型(即使用时必须a::red),char规定a的大小。
explicit(意为:明确的)
被explicit修饰的函数要被明确地使用(不进行默认的转换)。
如:
struct A{ A(int){} };
struct B{ explicit B(int){} };
A a1 = 1; //可,等于A a1 = A(1);
//但是B不能这样,B可以:
B b1(1);
extern
关键字extern用来告知编译器变量在当前范围之外声明过了。被extern语句描述过的变量将分派不到任何空间,因为他们在别的地方被定义过了。Extern语句频繁的用于在多个文件之间的跨范围数据传递.。
零散知识点:
1、1.0默认为double类型