c++学习笔记 附新特性

    技术2022-07-10  88

    c++学习笔记 第3版

    这里有一些是新特性,有一些是为了描述新特性另外说明的一些东西。 还有一些觉得觉得很不错的文章,权当自己学习c++以来的收获吧~ 大多的说明都是给出链接,供读者自行学习。


    c++三种继承方式-基础

    参考网址入口 这篇文章对三种继承方式讲的很明白,感觉自己多说一个字都不对劲。 成员默认是private,继承默认也是private。

    虚函数和纯虚函数-基础

    参考网址入口 基类中的virtual…=0,为纯虚函数,否则为虚函数。

    class Person { virtual void func() = 0; }; class Student : public Person { }; int main() { Person P;//error Student stu;//error 定义了纯虚函数的类称为抽象类,抽象类不能被实例化 return 0; } class Allthing{}; class Person:public Allthing { virtual void func() = 0; }; class Student : public Person{}; //虚函数可以继承也可以被继承

    在文章的总结2有一段话:虚函数必须实现,如果不实现,编译器将报错。 感觉不能理解,不知道这句话是在何种情况下是对的。对于上面的代码来说,既然抽象类可以被继承,那么子类是没有实现虚函数的,也没有报错。

    static

    参考网址入口 优先看 参考网址入口 深入了解 extern int a; 并不是像 int a; 一样在内存开辟空间,语义解读可为 在其它文件中引入int型变量a

    class Student { //static int x = 5; c++不允许在类中初始化static对象 public: static int x; }; int Student::x = 99;//初始化 int main() { Student stu; cout<<stu.x<<endl; return 0; }

    Variadic Templates …

    参考网址入口 这个好像和Java的类似,需要注意的是新名词的出现,//模板参数包,函数参数包,解包运算符; 实现方式是递归。

    forward

    请先看下面的右值引用 参考网址入口 写法:forward(t),其中t是T类型的对象。 在这之前请先了解左值引用和右值引用。 举例:func(100);//实参为右值引用。 还有一个move函数,就是转化为右值的。move()

    右值引用

    参考网址入口 我感觉就是看这个 总的语句是否分配了空间 ,没有分配就是右值引用 B站侯捷老师的视频 ,这个视频对于的右值引用做了十分详细的讲述,后面还有move和forward的讲解,很深入。强力推荐。

    nullptr nullptr auto

    这三个东西挺简单的,前两个之间看源码 auto是一个很好用的东西,让编译器推导变量类型。 示例:for(vector::iterator it=v.begin();it!=v.end();it++)可以写成 :for(auto it=v.begin();it!=v.end();it++)

    C++11下的初始化

    为了统一化管理,引入**{}花括号**初始化。 initializer_list:这个东西可以支持我们初始化的花括号使用 在使用vector vec1{ 1,2,3,4,5 };时,会自动生成initializer_list,initializer_list内含一个array的头指针和长度 参考网址入口 注意:感觉讲的很好。但是我认为有一个错误,源码是没有内含数组的,只是拿了一个指针和长度进来。可能版本不同把,我就没有深究了。对于它的使用标准库真是大量用了。

    int a;cin>>a; int b=2; int c=3; int d=max( {a,b,c} );//香 发现新大陆啊 cout<<d<<endl; return 0;

    explicit

    多用于构造函数中,explicit构造函数是用来防止隐式转换的。很小的一个东西,看之前如果知道类对象的隐式转换和显示转换就很容易懂了。

    新for循环

    for( decl : coll ){ statement} 搭配auto香的一批,该有全局的begin()和end(),参数放容器。 入口 这里有它的底层源码,底层还是用了常用的for,穿入头指针和尾指针,头指针++,当头指针等于尾指针时退出循环。右值引用,for结束则析构。

    =default ,=delete

    [参考网址入口](https://www.cnblogs.com/Li-F/p/11517192.html https://blog.csdn.net/u010640235/article/details/51286445) 在写代码的时候,’='是不能省略的,和两个关键字是一个整体,或者说,这就是一个关键字。 生成类的时候,会自动调动四种函数,=delete会禁用删除当前函数,=dafault用于显式要求编译器提供合成版本的四大函数。

    class Text { private: int x,y; }; int main() { Text t1; Text t2(t1); Text t3; t3 = t1; return 0; } //当创建一个类的时候,编译器会自动创建四种函数,构造,析构,拷贝,复制。

    Alias template

    用using定义别名,这个和typedef类似,一个最大的不同是using可以别名化模板。

    template<typename T> using Vec = std::vector<T, MyAlloc<T>>;//给一个化名 Vec<int> coll; //代码摘自侯捷老师的课程

    Template Template Parameter

    模板模板参数,这个感觉用的很少,想深究的自己去看。

    Type Alias

    使用using定义别名,和typedef功能一样 示例:using func = void(*)(int,int); 扩充,在string头文件中,都有basic_string string; basic_string的源码在它的.h文件里面,三千多行,我就不看了。

    noexcept

    参考网址入口 当函数不会有异常的时候,是应只当noexcept,并且是在关键字实在函数的声明或者是定义之后的。 对于异常,侯捷老师有专门的一讲课,实际开发中异常处理经常出现,值得深究。

    override

    参考网址入口 当父类的虚函数在子类中实现的时候使用,可以避免派生类中忘记重写虚函数的错误 当参数不一致时,编译器会报错给予提示

    final

    表明当前类是不可继承的。 说白了就是当前类是断子绝孙的,只有爸爸,没有儿子。

    另外,函数后面加上const,参考网址入口 说明当前函数为只读操作

    decltype

    http://c.biancheng.net/view/3722.html 这篇讲的比较深入 编译器自行推导类型。 这篇的使用比较直观

    lambda

    csdn参考地址 B站侯捷老师视频 知道语法即可,深入请自行了解。

    tuple

    csdn参考连接 可以看作是一个结构体或者是泛化的pair,只不过配备了很多的函数进行操作。

    enable_if 类

    参考网址入口 这是我在看pair可能到的,类模板一大串。

    // implicit constructiable for this type template <class U1 = Ty1, class U2 = Ty2, typename std::enable_if< std::is_copy_constructible<U1>::value && std::is_copy_constructible<U2>::value && std::is_convertible<const U1&, Ty1>::value && std::is_convertible<const U2&, Ty2>::value, int>::type = 0> constexpr pair(const Ty1& a, const Ty2& b) : first(a), second(b) { }

    is_convertible 和 is_copy_constructible 参考网址入口 在pair中有很多类,上面是两个例子。


    用于给各位学习者参考,仅供参考。

    也是对自己的学习记录—

    Processed: 0.009, SQL: 9