首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
您找到你想要的搜索结果了吗?
是的
没有找到

每个C++开发者都应该学习和使用的C++11特性

class FinalClass final { // ... }; // 尝试继承 FinalClass 会导致编译错误 // class Derived : public FinalClass...1. static_assert: static_assert 是一个编译断言,用于在编译检查某个条件是否成立,如果条件不成立,则会导致编译错误。...error_message 是一个字符串字面值,用于在编译错误时输出错误信息。...例如: static_assert(sizeof(int) == 4, "int must be 32 bits"); 这个静态断言会在编译检查 int 类型的大小是否为 4 字节,如果不是,则会产生编译错误...移动语义的使用场景: 容器中插入临时对象: 通过移动语义,可以避免容器中插入临时对象进行深拷贝,提高了插入的效率。

5310

【C++入门】内联函数、auto与基于范围的for循环

内联函数通常在函数定义处使用关键字inline进行声明,例如: inline int add(int a, int b) { return a + b; } 使用内联函数编译器会将函数的代码直接插入到调用处...f@@YAXH@Z),该符号函数 _main 中被引用 结果如下: 上述例子可以发现内联函数声明定义最好不要分离,否则会出现链接错误; 总而言之,内联函数是一种编程技术,可以用于提高函数调用的效率...(关于迭代器这个问题,现在大家了解一下就可以了) 4.C++98中的指针空值 良好的C/C++编程习惯中,声明一个变量最好给该变量一个合适的初始值,否则可能会出现不可预料的错误,比如未初始化的指针。...所以C++11中引入了nullptr关键字来代表一个空指针,用于表示指针不指向任何内存地址; 注意: 使用nullptr表示指针空值,不需要包含头文件,因为nullptr是C++11作为新关键字引入的...C++11中,sizeof(nullptr) 与 sizeof((void*)0)所占的字节数相同。 为了提高代码的健壮性,在后续表示指针空值建议最好使用nullptr。

11210

【C++】C++11 新特性

,得到了国际标准化组织(ISO)和美国标准化协会认可,以模板方式重写C++标准库,引入了STL(标准模板库) C++03 C++标准第二个版本,语言特性无大改变,主要:修订错误、减少异性 C++05...C++11 增加的语法特性非常篇幅非常,我们这里主要讲解实际中比较实用的语法。...即当列表中的元素类型和元素个数符合构造函数的参数要求,可以转化为调用构造函数来完成初始化,即 A{a, b, c} A(a, b, c);如下: class Date { public:...因此,C++11语法中出现了Lambda表达式。...&a, &b]:以引用传递的方式捕捉变量a和b,值传递方式捕捉其他所有变量; [&,a, this]:值传递方式捕捉变量a和this,引用方式捕捉其他变量; 捕捉列表不允许变量重复传递,否则就会导致编译错误

1.3K10

【C++】C++11 右值引用和移动语义

return tmp; //出这个函数tmp会自动销毁 } 这种情况下下编译器会使用这个局部对象拷贝构造一个临时对象,然后再返回这个临时对象,也就是说,会比引用返回一次拷贝构造;当局部对象是一个需要进行深拷贝的自动类型...注意:只有当实参为右值才会匹配 移动构造构造函数进行优化,当实参为左值编译匹配参数还是会匹配形参为 const T& 的拷贝构造函数;因为编译器不知道我们是否还会对左值进行操作,所以它不敢拿走左值的资源来构造新的对象...还提供了右值版本的插入接口: 所以,以后如果我们要向容器中插入需要深拷贝的自定义类型的元素,我们尽量构造匿名对象进行插入,这样调用的就是右值插入接口,元素会调用移动拷贝函数完成浅拷贝,从而提高程序效率..._ptr) {} int* _ptr; }; 但是上面这种做法只防止了类外进行拷贝,而在类内我们仍然可以调用拷贝构造函数完成拷贝,此时编译器在编译不会发生错误,只有运行起来对同一块空间析构两次才会报错...其实我们可以只给出拷贝构造函数的声明,且声明为私有;这样,只要调用了拷贝构造函数,那么链接一定会发生错误: private: A(const A& a); 上面是 C++98 中防止一个类被拷贝的做法

61810

c++17好用的新特性总结

inline变量出现后,我们可以直接将全局变量定义头文件中,而不用担心出现redefine的错误信息。...环境下,可以lambda表达式捕获显式引入一个引用变量通过编译: for(const auto& [key, value]: map){ [&key = key, &value = value...std::map/unordered_map中插入元素,我们往往使用emplace,emplace的操作是如果元素key不存在,则插入元素,否则不插入。...但是元素已存在,emplace仍会构造一次待插入元素判断不需要插入后,立即将该元素析构,因此进行了一次多余构造和析构操作。c++17加入了try_emplace,避免了这个问题。...通过使用std::variant,用户可以实现类似Rust的std::result,即在函数执行成功返回结果,失败返回错误信息,上文的例子则可以改成。

3K10

【C++初阶】--- C++入门(下)

Add(a | b, a & b) -> +优先级高于| and & 但是宏有非常的注意点,1. 不是函数;2. 分号问题;3. 括号控制优先级;4. 且预处理阶段就会被替换。...(此处++, ==是迭代器的类域中重载后的操作符,关于迭代器这个问题,后面会讲) 四、 指针空值nullptr(C++11) 良好的C/C++编程习惯中,声明一个变量最好给该变量一个合适的初始值,...否则可能会出现不可预料的错误,比如未初始化的指针。...注意: 使用nullptr表示指针空值,不需要包含头文件,因为nullptr是C++11作为新关键字引入的。...C++11中,sizeof(nullptr)与 sizeof((void*)0)所占的字节数相同。 为了提高代码的健壮性,在后续表示指针空值建议最好使用nullptr。

8710

我的C++奇迹之旅:内联函数和auto关键推导和指针空值

内联函数 内联函数是一种编译器优化技术,它可以将函数的代码直接插入到函数调用的地方,而不是通过函数调用的方式。这样可以减少函数调用的开销,提高程序的执行效率。... C++ 中,数组是一种特殊的数据结构,它的大小和元素类型在编译就必须确定。而 auto 关键字是用来进行类型推导的,它无法推导出数组的大小和元素类型。...,否则可能会出现不可预料的错误,比如未初始化的指针。...使用nullptr表示指针空值,不需要包含头文件,因为nullptr是C++11作为新关键字引入的。 2....C++11中,sizeof(nullptr) 与 sizeof((void*)0)所占的字节数相同。 3. 为了提高代码的健壮性,在后续表示指针空值建议最好使用nullptr

13810

【C++】C++11常用特性总结

改造lisi过后,从打印结果就可以看到,当push_back的元素是右值,我们自己实现的list也能够很好的完成右值引用版本的插入,不再进行像const左值引用版本的资源拷贝,而是直接移动右值资源,...下面的四行代码,相比C++98的插入元素接口,减少了四次深拷贝,效率很不错。...其实还有一种方法,就是只声明不实现,这样就会报链接错误,因为编译阶段生成的符号表存的拷贝构造函数的地址是无效的,所以链接阶段通过地址找拷贝构造函数的定义,就会发生链接错误,所以这样的方式也可以防拷贝。...上面都是C++98的解决方式,C++11中没有这么麻烦,只需要delete关键字就可以解决,拷贝构造的声明处加上delete修饰即可,如果有人进行对象的拷贝,则编译期间就会报语法错误。...捕捉列表中只有&,代表传引用捕捉lambda父作用域中lambda表达式向上的所有变量,如果有this指针则也可以捕捉this指针。 捕捉列表不允许变量重复传递,否则就会导致编译错误

77540

C++变化太大!该重新学习这门语言了

我们通过 vector 上使用算法、range 和 lambda,以便于寻找具有特定属性的元素,实现进一步的练习。 C++ 是一门古老但不断演进的语言。...该语言是需要编译的,面向特定的架构,如 PC、大型机、嵌入式设备、定制硬件,或者你想到的其他东西。如果你需要代码不同类型的机器上运行,那需要重新编译它。这有缺点也有优点。...你甚至可以使用 Matt Godbolt 的编译器探索器,浏览器上尝试基于各种编译器的代码。...ISOCpp 网站上有一个 FAQ 区域,概述了最近的一些变化,包括 C++11 和 C++14,以及整体的概览。另外,还有本关于 C++ 最近版本的图书。...我们使用流插入操作符<<来显示这些元素

16120

C++入门(2)

const pstring* p2;   // 编译成功还是失败? return 0; } 在编程,常常需要把表达式的值赋值给变量,这就要求声明变量的时候清楚地知道表达式的 类型。...同一行定义多个变量当在同一行声明多个变量,这些变量必须是相同的类型,否则编译器将会报错,因为编译 器实际只对第一个类型进行推导,然后用推导出来的类型定义其他变量。...9.2 范围for的使用条件 1. for循环迭代的范围必须是确定的 对于数组而言,就是数组中第一个元素和最后一个元素的范围;对于类而言,应该提供 begin和end的方法,begin和end就是for...指针空值nullptr(C++11) 10.1 C++98中的指针空值  良好的 C/C++ 编程习惯中,声明一个变量最好给该变量一个合适的初始值,否则可能会出现 不可预料的错误,比如未初始化的指针...使用 nullptr 表示指针空值,不需要包含头文件,因为 nullptr 是 C++11 作为新关键字引入 的 。 2.

9110

vs2017中C2440错误:“初始化”:无法从const char转换为char*问题解决

一、Bug描述 C2440错误表示编译器无法隐式地将一个const char数组转换为一个char类型的指针。...C++中,const char[]表示一个常量字符数组,而char是一个字符指针,指向可以修改的字符。编译器不允许这种转换,以防止对常量数据的潜在修改。...二、定位报错原因 类型不匹配:尝试将一个常量字符数组赋值给一个非const的字符指针。 意图不明确:代码可能需要一个指向可修改字符的指针,但却错误地声明了一个常量字符数组。...使用const_cast要非常小心,因为它可能会违反程序的封装性和数据的不变性。...+11的auto关键字 C++11引入的auto关键字可以简化类型声明,让编译器自动推断类型。

14710

【C++】深入剖析C++11新特性

C++11增加的语法特性非常篇幅非常,我们这里没办法一 一讲解,所以本期博客主要讲解实际中比较实用的语法。...---- 二、统一的列表初始化 1.{}初始化 C++98中,标准允许使用花括号 {} 对数组或者结构体元素进行统一的列表初始值设定。...2.类成员变量初始化 C++11允许类定义给成员变量初始缺省值,默认生成构造函数会使用这些缺省值初始化。...C++11中更简单,只需该函数声明加上=delete即可,该语法指示编译器不生成对应函数的默认版本,称=delete修饰的函数为删除函数。...捕捉列表不允许变量重复传递,否则就会导致编译错误。比如:[=, a]:=已经以值传递方式捕捉了所有变量,捕捉a重复。 c. 块作用域以外的lambda函数捕捉列表必须为空。 d.

33240

C++ 里的“数组”

Alex Stepanov 设计 STL 借鉴 Scheme 和 Common Lisp 语言起了这个名字,但他后来承认这是个错误——这个容器不是数学里的向量,名字起得并不好。...只有尾部插入和删除,其他元素才会不需要移动,除非内存空间不足导致需要重新分配内存空间。...可以使用 push_back 尾部插入一个元素 可以使用 insert 指定位置前插入一个元素 可以使用 erase 指定位置删除一个元素 可以使用 emplace 指定位置构造一个元素 可以使用...它们存在,说明容器对指定位置的删除和插入性能较高。vector 适合在尾部操作,这是它的内存布局决定的。只有尾部插入和删除,其他元素才会不需要移动,除非内存空间不足导致需要重新分配内存空间。...C++11 开始提供的 emplace… 系列函数是为了提升容器的插入性能而设计的。

10110

【C++】C++11中的常见语法(上)

C++11 增加的语法特性非常篇幅非常,我们这里没办法一 一讲解,所以本章主要讲解实际中比较实用的语法。...二、统一的列表初始化 1.{}初始化 C++98中,标准允许使用花括号{}对数组或者结构体元素进行统一的列表初始值设定。...三、声明 c++11 提供了多种简化声明的方式,尤其是使用模板。...类成员变量初始化 C++11允许类定义给成员变量初始缺省值,默认生成构造函数会使用这些缺省值初始化,这个我们类和对象已经介绍过了,这里就不再细讲了。 3.... C++11 中更简单,只需该函数声明加上 =delete 即可,该语法指示编译器不生成对应函数的默认版本,称 =delete 修饰的函数为删除函数。

14710

C++心决之内联函数+auto关键字+指针空值

是递归、且频繁调用 的函数采用 inline 修饰,否则编译器会忽略 inline 特性 3. inline 不建议声明和定义分离,分离会导致链接错误。...同一行定义多个变量 当在同一行声明多个变量,这些变量必须是相同的类型,否则编译器将会报错,因为编译 器实际只对第一个类型进行推导,然后用推导出来的类型定义其他变量 。...为了避免与 C++98 中的 auto 发生混淆, C++11 只保留了 auto 作为类型指示符的用法 4. auto 实际中最常见的优势用法就是跟以后会讲到的 C++11 提供的新式 for...指针空值nullptr(C++11) 10.1 C++98中的指针空值 良好的 C/C++ 编程习惯中,声明一个变量最好给该变量一个合适的初始值,否则可能会出现 不可预料的错误,比如未初始化的指针...使用 nullptr 表示指针空值,不需要包含头文件,因为 nullptr 是 C++11 作为新关键字引入 的 。 2.

9910

【笔记】《深入理解C++11》(上)

C++11的标准中提出SFINEA的动机是当年C++98中并没有对这个规则进行标准化的描述, 因此各个编译器对于函数模板的匹配规则都是混乱的, 因此新标准提出SFINEA来使程序员能按照自己的想象来理解编译器并令其能精确匹配我们所需要的函数...可行的保留并计算匹配的精确度, 选择最佳匹配的候选函数作为结果 如果存在两个相同匹配等级的参数列, 优先保留普通函数 完全找不到匹配的函数或者产生二义性, 引发error 这个尝试进行参数替换的过程中编译器只发生...failure, 不会引发error, 直到完成所有尝试 基础来说, SFINEA使得模板实例化的过程各个编译器上都能表现出一样的效果, 且避免不相关模板可见实例化出错误的程序....而且由于其本质是常量数值的原因, enum成员总是可以被隐式转换为整型, 这很容易导致比较两个不同的枚举名称出现错误的结果 C++11之前会通过类结构将枚举封装, 并建立新的转换和比较函数覆盖原先的操作...{ Name0, Name1 };直接获得了强作用域, 转换限制, 可指定底层类型三大优点 其中通过上面代码中类型名冒号后面写所需的type, 我们可以指定枚举属于type类型的元素的集合, 同时原生的

1.8K20
领券