【C++标准库】C++11新特性
模板表达式内的空格
空指针
C++定义了nullptr以取代0或者NULL。nullptr是std::nullptr_t类型的(constexpr)变量。std::nullptr_t可以显式或隐式地转换为任何指针(包括类的成员函数指针),但不能显式或隐式地转换为任何其他类型。
auto自动类型推导
Range Based for循环
类似于别的语言中的foreach循环
template <typename T> void PrintElement(const T& coll) //打印集合内所有元素 { for (const auto& elem : coll) { std::cout << elem << std::endl; } }
move语义
与move相对的就是copy。众所周知,C++的变量都是“值语义”的。所谓的值语义的变量,就是它的行为跟int类型是一样的,典型表现就是作为参数传入函数中需要再复制一个作为形式参数,它的变化不会影响到原来的变量。 这样就会造成多次没有意义的copy,即损失了时间又损失了内存。
move是将对象的状态和所有权从一个对象转移到另一个对象,只是转移,没有内存的搬迁或者内存的拷贝。
C++中move()可实现所有权的转移:
string s1 = "apple"; string s2 = "banana"; s1 = move(s2); //s1=="banana" vector<int> v1; vector<int> v2 = { 1,2,3,4 }; v1 = move(v2); //v1={1,2,3,4}
转移之后的状态为“仍然有效,但状态不明”。
Range based for循环
类似于其它编程语言中的foreach循环。
template <typename T> //打印集合内所有元素 void PrintElements(const T& coll) { for (const auto& elem : coll) { std::cout << elem << std::endl; } }
原生字符串
Raw string以R"(开头,以)"结尾
如果要在raw string内输出)",可以使用定义符,因此一个完整的语法是 R"delim(...)delim",其中delim为一个字符序列,最多16个基本字符,不可包含反斜线、空格和小括号。
cout << R"abcd(\\hello world)abcd" << endl; //--> \\hello world
noexcept关键字
noexcept关键字用于指明某个函数无法或者不打算抛出异常。
constexpr关键字
常量表达式是指不会改变并且在编译过程中就能得到计算结果的表达式
constexpr int square(int x) { return x*x; } int main() { float a[square(3)]; //定义数组大小需在编译期确定 return 0; }