![](https://img-blog.csdnimg.cn/20201014180756724.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C++11/14
现代C++语言
Damon_liufb
这个作者很懒,什么都没留下…
展开
-
C++11——const_iterator
C++中有一个原则:只要有可能,就应该使用const。const_iterator是STL中指涉到const指针的等价物,指涉到不可被修改的值。任何时候只要我们需要一个迭代器而且其指涉的内容没有必要修改,我们就应该使用const_iterator。 在C++98中,const_iterator得到的支持不够全面。建立它们不容易,而且建立好了后使用方法也受限。比如说我们想要在vector中插入数据,按照C++的原则如果我们不需要改动数值那么就把内容设置成为const,但是插入操作只能接受iterato原创 2020-10-20 19:47:48 · 1255 阅读 · 0 评论 -
C++11关键字:override
C++继承与派生中的一个最基本的理念是:在派生类中虚函数的实现,会改写基类中对应虚函数的实现。改写(override)和重载(overload)两个概念容易弄混,但是我们要知道,正是由于虚函数的改写,使得通过基类接口调用派生类函数成为可能。如果要让改写动作真的发生,有一系列要求必须满足:基类函数必须是虚函数;基类和派生类中(除析构外)函数名字必须相同;基类和派生类中的函数形参型别必须完全相同基类和派生类中的函数常量性必须完全相同C++11中还要求基类和派生类的引用饰词必须相同。原创 2020-10-13 15:52:12 · 298 阅读 · 0 评论 -
成员函数引用饰词
成员函数引用饰词是C++11中鲜为人知的语言特性。它们是为了实现限制成员函数仅用于左值或者右值的。带有引用饰词的成员函数不必是虚函数。class Widget{public: void doWork()&; //仅在*this是左值时调用 void doWork()&&;//仅在*this是右值时调用};Widget makeQidget(); //函数返回的是右值Widget w; //普通对象,是左值w.doWork(); //以左值调用make原创 2020-10-13 15:45:44 · 184 阅读 · 0 评论 -
C++11删除函数
优先选用删除函数,而不是private未定义函数任何函数都可以删除,包括非成员函数和模板具现 我们时常会面临这种情况,程序中我们有一些不希望外部调用的函数。虽然我们可以不声明不定义,但是对于一些自动生成的函数,比如复制构造函数和复制赋值运算符,这些函数在某些情况下也不希望外部调用。 一个例子,C++标准库中输入输出流库继承谱系基类部位的,是类模板basic_ios,所有的输入输出流都继承该类。对于输入输出流进行复制是不可取的,因为我们不知道要落实成什么样子。对于一个istream对象表示一..原创 2020-10-13 09:45:42 · 2103 阅读 · 0 评论 -
C++11枚举类——enum class
文章目录枚举类优势——降低命名空间污染枚举类优势——避免发生隐式转换枚举类优势——可以前置声明C++98中enum的使用情况enum现在被称为不限范围的枚举型别enum class是限定作用域枚举型别,他们仅在枚举型别内可见,且只能通过强制转换转换为其他型别。两种枚举都支持底层型别指定,enum class默认是int,enum没有默认底层型别enum可以前置声明,enum仅在指定默认底层型别的情况下才能前置声明 众所周知在C++中,变量名字仅仅在一个作用域内生效,出了大括号作用域,原创 2020-10-12 17:41:09 · 58526 阅读 · 4 评论 -
C++11——别名声明
typedef不支持模板化、但别名声明支持别名模板可以让人免写“::type”后缀,并且在模板内,对于内嵌typedef的引用经常需要加上typename前缀在程序中,我们有时候需要用到很长的型别类型,例如:“std::unique_ptr<std::unordered_map<std::string,std::string>>”。这么长的类型,以往我们会使用typedef来定义别名。但是在C++11中,新增了别名声明来替代它。//使用typedef:typedef..原创 2020-10-10 17:32:20 · 692 阅读 · 0 评论 -
C++11关键字——nullptr
相对于0或者NULL,优先选用nullptr避免在整型和指针型别之间重载0和NULLC++98中,程序员常常采用0或者NULL来判断指针是否为空。在C++11中,我们要采用nullptr来避免不必要的麻烦。 字面常量0的型别是int,而不是一个指针。当C++在只能使用指针的语境中发现了一个0,虽然也会勉强解释为空指针,但是这是个不得已的行为。 以上结论对NULL也成立。虽然标准允许给予NULL非int的型别(比如long),但是不论是0还是NULL,它们都不具备指针型别。 C++的..原创 2020-10-10 16:12:33 · 345 阅读 · 0 评论 -
()和{}初始化的用法
大括号初始化可以应用的语境最为宽泛。可以避免令人苦恼的解析语法、可以阻止隐式窄化型别转换构造函数重载决议期间,只要有任何可能,大括号初始化物就会与带有std::initializer_list型别的形参想匹配,即使其他重载版本更合适使用两个实参来创建std::vector<数值类型>结果会大相径庭。这是大括号与小括号之间的一个明显不同的例子我们指定初始化的方式包括使用小括号、使用等号或者使用大括号。int x(0); //使用小括号初始化int y = 0; //使用等号初始化..原创 2020-10-09 20:12:46 · 2015 阅读 · 1 评论 -
C++11——auto的使用
文章目录抛弃显式型别声明改用auto抛弃显式型别声明改用autoC++98时代,我们声明变量都是显式的://初始化变量int x;//使用迭代器的提领结果来初始化局部变量template<typename It>void dwim(It b,It e){ while(b!=e) { typename std::iterator_traits<It>::value_type currValue = *b; }} 声明int x的时候我们根本就原创 2020-10-09 16:51:48 · 634 阅读 · 0 评论 -
C++11——std::function
std::function是C++11标准库的一个模板,它把函数指针的思想加以推广。函数指针只能指涉到函数,而std::function却可以指涉到任何可以调用的对象,即任何可以像函数一样可以实施调用之物。 我们想要创建一个函数指针就必须要指定欲指涉到的函数的型别(即该指针指涉到的函数的签名),类比来看,我们想要创建一个std::function对象就必须指定欲指涉的函数的型别。这一步是通过std::function模板形参来完成的。//声明一个函数对象func,它可以指涉到任何能用以下述签名调用原创 2020-09-30 15:08:48 · 170 阅读 · 0 评论 -
C++型别推导
型别推导函数模板 C++中有三套型别推导规则,分别为函数模板、auto、decltype。型别推导让我们不用写那些不言自明的冗余的型别。还提高了软件的适应性,在源代码的其中一个地方对一个型别进行改动可以自动传播到其他地方。函数模板函数模板的使用如下://模板声明template<typename T>void f(ParamType param);//模板调用f(expr);编译期,编译器会通过expr来推导T的型别和param的型别。这两个型别往往是不一样的。因为Pa原创 2020-09-30 10:52:16 · 756 阅读 · 0 评论 -
Trailing return types尾部返回类型
文章目录为什么要有尾部返回类型什么是返回类型推导(return type deduction)不是什么时候都要使用尾部返回类型 尾部返回类型在C++中是一个很奇怪的内容,我们应该只在必要的时候使用。我们要决定采用它作为一种通用风格的时候一定要小心,并尽量的保持这种风格。 首先看下列代码:auto getMulticastHops() const -> int;这是一种声明C++11语言中函数的方法。->int部分称为尾部返回类型,这行代码和一下代码是相同的:int getMult转载 2020-09-29 11:41:01 · 330 阅读 · 0 评论