c++学习笔记 附新特性

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_convertibleis_copy_constructible 参考网址入口
在pair中有很多类,上面是两个例子。


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

也是对自己的学习记录—

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值