C++11标准库-新特性

来自于C++标准库第二版,侯捷翻译 的那本。本文主要是简要总结,还有一点看不太懂的地方,会只有一个简要说明
1.vector> v,这里不需要把两个>>分开也不会报错,
老标准会报错,必须分开写,> >
2,新的空指针,int *p = nullptr,作用于
void f(int);
void f(int*)
f(0)
f(NULL),
f(nullptr)
,此种情况个人认为大为有用,具体类型std::nullptr_t ,还未了解,
3,auto自动推到
与以往的auto应当完全不一样了,
auto i = 42;
double fun();
auto i = fun();
auto i;//错误,如同引用类似,必须有明确类型方能推导
vector v;
auto pos = v.begin();
auto pos = v;
for(auto pos : v)
{
cout << *pos << endl;//错误,pos是vector pos;
}
auto可以推导lambda类型
auto l = [](int x)->bool{return false;}
个人觉得auto可以用在如遍历这样不需要了解细致的场合,其他场合还是明确类型较好些
typeid(变量).name(),查看类型
更多的初始化方式
int value[] = {1,2,4};
vector v{1,2,4};
这种适合这种序列式的初始化,至少书中之说了这两个例子,
但是注意,初始化的类型必须一致,
int value[]{1,2.5};//错误
4,全新的for循环,
int value{1,2,3};
for(auto pos :value)
{},另外例子2中有一个说明
5 move语义,老实讲,我看的一头雾水,主要讲搬迁和拷贝的性能影响,不太明白最终要我们怎么去做,所以只能暂时忽略,
6,新的字符串,这个举例非常简单,但也只是做了概括,变动应当不小,后面的章节应当有详细解释,所以暂时忽略
7 noexcept,不抛出异常,
void fun()noexcept(),还举了一个稍微复杂的例子

void swap(Types& x,Types& y)noexcept(noexcept(x.swap(y)))
{}
`这个意思大概是设定条件,如果符合就不抛出异常,noexcept(x.swap),小括号里不可抛出异常就会产生true,
另外说C++11不鼓励使用异常

8,constexpr让表达式核定于编译时
constexpr int fun(int x)
{
return x*x;
}
float arr[fun(5)];//C++11,可以这么做,但总是觉得有点别扭,使用这样的代码总是觉得有点不安全的感觉
另外可以:

array<float, numeric_limits<short>::max()> a;//尽管没见过
constexpr string str = "hello";//错误的,不太明白为什么,可能和编译时产生有些关系?

9 lambda类型,觉得它像个函数,调用时要加()
定义:[外部参数] (参数)->返回类型 {…}
外部参数可有可无,参数可有可无,返回类型可有可无,
如:[]{},
auto l = []{cout << "hello" << endl;}
auto l = [](int x){ cout << x << endl;}

l(5);

[]()->double{return 42;}//返回类型double
传递使用外部参数
    int x = 10;
    int y = 20;
    auto l = [=,&y]()//声明,y是引用传递,其他则是值传递[x,y]也是可以的,
    {
    //内部无论是否在[]声明使用谁,可以使用外部变量,但若非&,那么就是值传递,不得做更改操作,如果是&传递,像y,可以做任何操作,
        y = y + 10;
        cout << x << endl;
        y = x + y;
    //  x = x + 10;//错误
    };
    cout << y << endl;
    l();//调用
    cout << y << endl;
//  lambda作为返回类型,使用C++标准库
#include 
function<int(int, int)> returnlambda()
{
return [] (int x,int y)
{
return x*y;
};
}
int main()
{
auto lf = returnlambda();
cout << lf(5,6) << endl;
}

auto 搭配lambda算是物尽其用了,否则个人还是认为一般情况下明确类型的好,

10.模板
其实到目前为止,工作中从未写过模板,其实C++好些机制几乎都用不到,这是题外话,模板支持不定参数

templateT,typename...Types>//...就是不定参数,Types只是个名字
void print(const T& t,Types...name)
{
    cout << t << endl;
    cout << name << endl;
}

另外还举例了一个别名模板(或者叫模板重定义),没太明白,暂时不说,将来明白后再回来修改本日志,本书还单独拿出了一节来叙述模板的一些特性,并非新加的特性,虽然没用过,也忘的差不多了,但一直都觉得模板绝对是个好东西,谨记模板是个好东西,而且模板的类型一定要匹配,
11 新类型

char16_t t;
    char32_t t2;
    long long int a;
    unsigned long long b;
    int* p = nullptr;
    nullptr_t p;//暂时不明,sizeof(p) == 4;
    int i;
    int i = int();//初始化0
    int i{};//全新的初始化方式0,真不知道增加这个弱智东西有什么意义,

12 decltype 新的关键字
并不是很理解这个关键字的大用处究竟在什么地方,声明返回类型,我可以直接auto就可以,很难想象场景,认知太浅薄,因为从未使用C++11的代码

vector<int> v;
    decltype(v)::value_type p;//找出类型
template<class T>
①decltype(x + y) fun(T x, T y)//可以声明返回类型
{
    return x + y;
}
②template<typename T1,typename T2>
auto fun(T1 x,T2 y)->decltype(x+y)//返回声明类型
{}
,两种写法意思相同,看书的时候差点搞混了,只是第二种仅仅是类似lambda写法,并不是返回lambda类型,因为lambda是[]{}这样的语法,这又是一个弱智的做法,发明第二种这种奇怪的写法,意义究竟在哪里,简直就是画蛇添足!
茴香豆的茴有四种写法,你都知道么。。。

13 新的枚举类型,但不是很理解
enum class S:char{mr,ms,co};//可以指定类型char
还不是很明白使用场景,介绍也很简略,
https://www.cnblogs.com/diegodu/p/6169808.html,搜到了一个详细说明,可以自己搜一下改变在哪里,暂时先写到这里

总结,本文所有东西均出自《C++标准库第二版》,一切从头开始学习

你可能感兴趣的:(C++11标准库学习,c++)