深入学习c++ 关键词第二部分

深入学习c++ 关键词第二部分

头文件 iostream

compl

同于 ~

constexpr

带有constexpr标识的函数的计算工作可以在编译阶段完成(在可以计算出来的情况下)。
如下面代码所示,若没有constexpr则会报错。

#include 
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类型

你可能感兴趣的:(c++,c++)