c++11基础语言特性

134 阅读3分钟
C++11问世以来所增加的新C++特性将在工程构建的过程中起着重要而便捷有效的变化。拥抱C++11的特性将会是一个程序开发者和计算机工程师的一把利剑

1、几个比较重要的小型语法应用:   

1、nullptr和std::nullptr_t      

       C++11使用nullptr区别0或NULL,用来表示一个pointer指向novalue,引入nullptr的一个重要目的是为了在函数重载时避免整数类型参数的误读:

     

void f(int);
void f(void *);


calls:
   f(0); // calls f(int)
   f(NULL); //calls f(int) if NULL is 0, otherwise ambiguous 
   f(nullptr); //calls f(void *)

nullptr可以被自动转换为各种pointer类型,但不会被转换为任何整数类型,其本身的类型是std::nullptr_t,定义于<cstddef>,其中std::nullprt_t被认为是一个基础类型。

2、auto自动类型推导

  •  变量或类型的自动类型推导:

       

auto i = 33;
char* func(); auto f = func();
static auto val = 9;
vector<string> v; auto a = v.begin();//返回迭代器
auto l = [](int x)->bool {}; //lambda 

  • 模版类型推导

      一般地,函数模版的构造大致如下:

template<typename T>
void f(ParamType param);

      调用模版的方法一般为f(expr); 在编译期,编译期会通过expr来推导两个必须确定的类型:一个是T的类型,另一个是ParamType的类型。一个比较普遍的情形是大多数这两个类型是不一样的,ParamType常常会包含一定的修饰语如const ,&,*等。所以有必要对ParamType进行类型分析:

  1.    ParamType具有指针或者引用修饰,但不是万能引用 
  2.    ParamType是万能引用
  3.    ParamType既不是指针也不是引用
通常auto的类型推导可以认为是一个类似于函数模版类型推导的概念。 

3、Range-Based for循环

       C++11引入了一种崭新的for循环形式,其基本语法类似于java和python等语言的foreach,可以逐一迭代某个给定的区间、数组、集合内的每一个元素。其格式如下:

        

std::vector<double>  vec;
for (auto& elem : vec)
{
    std::cout << elem << std::endl;
} //这里将elem声明为引用,否则for循环中的语句会作用在元素的一份local copy上

4、字符串字面常量(String Literal)

    C++11提供了raw string 和 multibyte/wide-character等字符串字面常量

     Raw  String 以R"@(开头,以@)"结束,其中@是一类一样的字符串用来保证里面的()也能正常显示的约定。

     可以使用编码前缀来为字面常量定义特殊的字符编码如u8,u,U,L等

    

string s = R"U((555))U"; cout << s << endl;
L"Hello";//defines "hello" as wchar_t string literal