专业编程基础技术教程

网站首页 > 基础教程 正文

c++11 新特性总结(一) c++ 11 特性

ccvgpt 2024-10-19 03:24:16 基础教程 8 ℃

1.类型与变量相关

1.1 nullptr

c++11 新特性总结(一) c++ 11 特性

c++11引入了nullptr关键字 专门用来区分空指针和0

在某种意义上来说,传统c++会把NULL和0视为同一种东西,这取决于编译器如何定义NULL,有些编译器会将NULL

定义为((void*)0) 有些则会直接将其定义为0。

c++不允许直接将void*隐式转换到其他类型,但如果NULL被定义为((void*)0) 那么当编译char* ch=NULL时,

NULL只好被定义为0。

1.2 auto

auto并没有让c++成为弱类型语言,也没有弱化变量什么,只是使用auto的时候,编译器根据上下文情况,确定auto

变量的真正类型,auto作为函数返回值时,只能用于定义函数,不能用于声明函数

auto AddTest(int a,int b)
{
	return a + b;
}
int main()
{
	auto index = 10;
	auto str = "abc";
	auto ret = AddTest(1, 2);
	std::cout<<"index" << index <<std::endl;
	std::cout<<"str"<<str<<std::endl;
	std::cout<<"ret"<<ret<<std::endl;
}

1.3 constexpr

近似const 可以修饰变量 也可以修饰函数

修饰变量如:

const int global = 100;
int main()
{
	int temp = 100;
	constexpr int a = 1; //right 
	constexpr int b = global; //right
	constexpr int c = temp; //wrong 
}

即可以赋值字面常量也可以赋值以const变量

重点:constexpr修饰的函数 生效于编译时而不是运行时 重点应用于修饰函数使其在编译期大幅度被解释

被constexpr 修饰的函数 无论是普通函数 还是类成员函数,必须是编译器可计算得到结果,即字面常量 不可是

运行时才能获取的内容

1.4、using取代typedef

typedef double db; //c99
using db = double; //c++11
typedef void(*function)(int, int);//c99,函数指针类型定义
using function = void(*)(int, int);//c++11,函数指针类型定义
using kvpairs = std::map<std::string, std::string>; //c++11
using CompareOperator = std::function<int (kvpairs &, kvpairs &)>; //c++11
using query_record = std::tuple<time_t, std::string>; //c++11
template<class T> using twins = std::pair<T, T>; //更广泛的还可以用于模板

for循环语法

习惯C#或java的同事之前使用C++的时候曾吐槽C++ for循环没有像C#那样foreach的用法,是的,在C++11之前,标准C++是无法做到的。熟悉boost库读者可能知道boost里面有foreach的宏定义BOOST_FOREACH,但个人觉得看起并不是那么美观。

int main()
{
	int numbers[] = {1,2,3,4};
	std::cout<<"numbers" <<std::endl;
	
	for (auto v : numbers)
	{
		std::cout<< v << std::endl;
	}
}


Tags:

最近发表
标签列表