第3章 转向现代C++ 条款7:在创建对象时注意区分()和{} //创建对象时候注意区分 () 和 {} //指定初始化的方式有:小括号,等号,大括号 //情况1:内建型别来说 int 初始化和赋值没有区别...不可复制的对象,可以用 {}或()进行初始化,不能使用 = std::atomic ai1{0}; std::atomic ai2(0); //std::atomic ai3...,所以 MyAllocList::type //称为带依赖型别,c++规定带依赖型别必须前面加个 typename //如使用 using 模板定义,typename的要求就消失了 template...条款11:优先选用删除函数,而非private未定义函数 //宗旨:阻止调用函数得方法:函数未经声明,不可调用 //删除函数得优点1: //删除函数无法通过任何方法使用,所以即使成员和友元函数中得代码也会因试图复制...,或类得友元并使用了它们 //链接阶段就会由于缺少定义而失败 //例如:为了让输入流和输出流类成为不可复制得 //例如:为了让输入流和输出流类成为不可复制得 template<class charT,class
std::initializer_list std::initializer_list 是C++标准库中的一个类模板,用于表示一组以花括号 {} 括起来的初始值序列。...主要用于函数参数的接收,允许代码编写更灵活、简洁的代码。 特点: std::initializer_list 是一个轻量级的不可修改的对象,用于以数组形式存储初始化值。...它提供类似数组的访问方式,比如 .begin() 和 .end() 。 适合传递数量不确定的参数。 限制: std::initializer_list 的元素是不可修改的,只能读取。...,同时也更贴合现代 C++ 的设计理念(如 RAII、泛型编程等)。...包装器 function 在C++中,function 是一个通用的函数包装器,它能够储存、复制和调用任何可调用目标,包括普通函数、Lambda表达式、函数对象以及成员函数。
如何积累,一定是从细微处着手,观摩优秀的代码,学习现有的框架,汲取前人留下的智慧。 本篇是拜读《Effective Modren C++》后的笔记。...而value3同样用auto,加上类型转换就无此问题(只是这样还不如直接用bool声明变量)。 7....区别使用 () 和 {} 创建对象 「C++初始化方式」 C++的语法中,初始化的方式主要有三种方式: int x(0); // 使用()初始化 int y = 0; // 使用=初始化...如果在常量表达式中使用了不允许的操作或无效的值,编译器会在编译时发出错误或警告,帮助我们及早发现并修复问题。 16....理解特殊成员函数的生成 在C++术语中,特殊成员函数是指自己生成的函数。C++98有四个:默认构造函数、析构函数、拷贝构造函数和拷贝赋值函数。
languages – C++ 相比于C++98/03,C++11则带来了数量可观的变化,其中包含了约140个新特性,以及对C++03标准中约600个缺陷的修正,这使得C++11更像是从C++98...也可以作为operator=的参数,这样就可以用大括号赋值 我们当初在模拟实现这些STL容器时,并没有实现initializer_list,今天我们以vector为例子,实现一下initializer_list...右值引用的主要目的是允许函数或操作以“移动”而不是“复制”的方式处理资源,这通常意味着资源的所有权从源对象转移到目标对象,源对象则变为一个安全可销毁的状态。...移动语义 移动语义允许对象通过转移其资源(如动态分配的内存)而不是复制它们来初始化或赋值另一个对象。这通常是通过一个特殊的成员函数——移动构造函数和移动赋值操作符来实现的。...移动构造函数: 接受一个右值引用参数,用于初始化新对象,通过转移源对象的资源而不是复制它们,从而避免不必要的资源分配和复制。
volatile 关键字声明的变量,每次访问时都必须从内存中取出值(没有被 volatile 修饰的变量,可能由于编译器的优化,从 CPU 寄存器中取值) const 可以是 volatile (如只读的状态寄存器...修饰构造函数的对象不可以从 int 到 B 的隐式转换 if (b1); // OK:被 explicit 修饰转换函数 B::operator bool() 的对象可以从 B 到 bool 的按语境转换...,因为使用初始化列表可以不必调用默认构造函数来初始化 initializer_list 列表初始化 用花括号初始化器列表初始化一个对象,其中对应构造函数接受一个 std::initializer_list...若析构函数不可访问,则不能在栈上创建对象。...unique_ptr 用于取代 auto_ptr auto_ptr 被 c++11 弃用,原因是缺乏语言特性如 “针对构造和赋值” 的 std::move 语义,以及其他瑕疵。
优点: C 语言的类型转换问题在于模棱两可的操作; 有时是在做强制转换 (如 (int)3.5), 有时是在做类型转换 (如 (int)"hello"). 另外, C++ 的类型转换在查找时更醒目....定义: 在声明的变量或参数前加上关键字 const 用于指明变量值不可被篡改 (如 const int foo )....创建 64 位常量时使用 LL 或 ULL 作为后缀, 如: int64_t my_value = 0×123456789LL; uint64_t my_mask = 3ULL << 48; 如果你确实需要...值得庆幸的是, C++ 中, 宏不像在 C 中那么必不可少. 以往用宏展开性能关键的代码, 现在可以用内联函数替代. 用宏表示常量可被 const 变量代替. 用宏 “缩写” 长变量名可被引用代替....定义: C++11 中,若变量被声明成 auto, 那它的类型就会被自动匹配成初始化表达式的类型。您可以用 auto 来复制初始化或绑定引用。
因为这是一个拷贝指针的操作,因此保留原指针的不可更改指向性并没有太大的意义 auto 大多数情况下auto推断出来的结果和模板类型推导的结果是一样的,不同点在于对大括号初始物的处理 值与指针等推导 const...中使用auto 总结: •当你想要拷贝range的元素时,使用for(auto x : range)•当你想要修改range的元素时,使用for(auto&& x : range)•当你想要只读range...decltype能够从表达式中推断出要定义的变量类型 decltype(a + b) i; //假设a是int而b是double,那么i的类型就是表达式(a + b)的类型,即double •当decltype...C++中都得到了提高 在C++11中,constexpr可以用来修饰对象(包括内置类型和自定义类型),以及可以用来修饰函数(构造函数,成员函数,普通函数等等),如果以constexpr修饰构造函数,那么代表构造出来的对象可以是一个编译期常量...) 但按值捕获也不一定能保证悬垂安全,例如对this指针的捕获 初始化捕获 初始化捕获是C++14中引入的新特性,解决了C++11中无法“移动捕获”的问题(可以理解为是为Lambda生成的匿名类创建并初始化类成员
也可以作为operator=的参数,这样就可以用大括号赋值 代码示例如下: int main() { std::initializer_list mylist; //相当于在栈上开了一个数组...左值是一个表示数据的表达式(如变量名和解引用的指针),我们可以获取它的地址,也可以对它赋值,左值可以出现在赋值符号的左边,右值不可以出现在左边。...右值引用的主要目的是允许函数或操作以“移动”而不是“复制”的方式处理资源,这通常意味着资源的所有权从源对象转移到目标对象,源对象则变为一个安全可销毁的状态。...右值不可以被取地址,不可以出现在等号左边,只能出现在等号右边,不可以改变值的大小。...如果不想rr1被修改,可以用const int&& rr1 去引用 移动语义 移动语义允许对象通过转移其资源(如动态分配的内存)而不是复制它们来初始化或赋值另一个对象。
14.整型 C++ 内建整型中,仅使用 int。如果程序中需要不同大小的变量,可以使用 中长度精确的整型,如 int16_t。...宏意味着你和编译器看到的代码是不同的。这可能会导致异常行为,尤其因为宏具有全局作用域。值得庆幸的是,C++ 中,宏不像在 C 中那么必不可少。以往用宏展开性能关键的代码,现在可以用内联函数替代。...C++11 中,若变量被声明成 auto,那它的类型就会被自动匹配成初始化表达式的类型。您可以用 auto 来复制初始化或绑定引用。...p = {1,2}; 从 C++11 开始,该特性得到进一步的推广,任何对象类型都可以被列表初始化。...Boost库集是一个广受欢迎,经过同行鉴定,免费开源的C++优秀库集。 优点:Boost代码质量普遍较高,可移植性好,填补了 C++ 标准库很多空白,如型别的特性,更完善的绑定器,更好的智能指针。
Tags: c++ Note:为避免各种侵权问题,本文并没有复制原书任意文字(代码除外,作者已经声明代码可以被使用)。需要原书完整中文翻译的读者请等待官方译本的发布。...,这不是所期望的; 当类的多个构造函数里,有一个是用std::initializer_list时,要注意其他构造函数不能用{}语法; 当类有类型转换函数时,第二个缺点会变得更严重:复制构造函数可能不会被调用...然而,如果其中一个参数是编译时期不可知的,这个函数肯定不会在编译时期就执行。这个自动处理是自动的、隐式的,也就是说不要求程序员写2个函数,一个runtime用,一个compiling用。...从第二点可以反推,如果一个函数不是constexpr,那么即使你传递给它的参数都是编译时期已知的,这个函数也不一定就会在编译时期执行。 具体怎么玩?...条款16: 关于编译器自动生成的成员函数 移动构造函数(move constructor)和移动赋值操作符(move assignment operator),是modern c++新补充的generated
C++11中的std::initializer_list 上⾯的初始化已经很⽅便,但是对象容器初始化还是不太⽅便,⽐如⼀个vector对象,我想⽤N个值去构造初始化,那么我们得实现很多个构造函数才能⽀持...右值 也是⼀个表⽰数据的表达式,要么是字⾯值常量、要么是表达式求值过程中创建的临时对象等,右值可以出现在赋值符号的右边,但是不能出现出现在赋值符号的左边,右值不能取地址。...对于像string/vector这样的深拷⻉的类或者包含深拷⻉的成员变量的类,移动构造和移动赋值才有意义,因为移动构造和移动赋值的第⼀个参数都是右值引⽤的类型,他的本质是要“窃取”引⽤的 右值对象的资源...,(就是资源转移)⽽不是像拷⻉构造和拷⻉赋值那样去拷⻉资源,从提⾼效率。...C++中不能直接定义引⽤的引⽤如 int& &&ret=i,这样写会直接报错,通过模板或 typedef中的类型操作可以构成引⽤的引⽤。 2.
但是这种类型转换不会导致编译器报错,因为 C++ 标准规定了这种类型转换是可以进行的。 ...如果必须进行类型收缩转换,建议进行额外的检查和处理,以避免不可预期的行为。...是用迭代器区间构造的吗? 答案:不是!这里其实是 C++11 引入的新特性:initializer_list 。 这是一个专门用来初始化列表的类! ...它可以将你放入 {} 中的元素按照你要的类型 T 生成一个 initializer_list 对象,接着还有重要的一步,就是如 vector、list 等容器中,C++11 已经添加了新的构造函数参数:...).name() << endl; return 0; } // 运行结果 class std::initializer_list 那么我们如何在模拟实现 vector、list 等容器的时候增加
C++11扩大了用大括号括起的列表(初始化列表)的使用范围,使其可用于所有的内置类型和用户自定义的类型,使用初始化列表时,可添加等号(=),也可直接省略 创建对象时也可以使用列表初始化方式调用构造函数初始化...std::initializer_list是C++标准库提供的一个模板类 当我们使用初始化列表初始化对象时,编译器会自动从用大括号{}括起来的值列表构造一个std::initializer_list对象...举个例子,在代码片段auto il = { 10, 20, 30 };中,一个std::initializer_list对象il被创建,其中包含值10、20和30。...引用折叠: 引用折叠是 C++11 中的一个规则,用于确定引用的最终类型。在模板中使用引用时,引用可能会发生折叠,最终得到左值引用或右值引用。...()和insert emplace_back() 是 C++ 容器类(如 std::vector, std::deque, std::list 等)提供的一个成员函数,用于在容器的末尾直接构造一个新元素
个人主页:Quitecoder 专栏:c++笔记仓 相比于C++98/03,C++11则带来了数量可观的变化,其中包含了约140个新特性,以及对C++03标准中约600个缺陷的修正,这使得C++11更像是从...它的主要特点包括: 表示一组常量值的不可变数组(只读的顺序容器)。 提供对数组元素的访问,但不能修改其中的值。 由编译器隐式生成,用户无需直接构造 initializer_list 对象。 2....主要功能 std::initializer_list 提供以下功能: 支持范围循环遍历。 提供成员函数 begin() 和 end(),便于访问底层元素。 提供成员函数 size() 获取元素个数。...注意事项 不可修改内容:std::initializer_list 中的内容是常量,不能被修改。 只能用于固定大小的初始化:如果需要动态大小的数据结构,应使用其他容器(如 std::vector)。...隐式生成:不能显式创建 std::initializer_list 对象,必须通过 {} 初始化。
于是C++标准委员会在C++11标准中改变了auto关键字的语义,使它变成一个类型占位符,允许在定义变量时不必明确写出确切的类型,让编译器在编译期间根据初始值自动推导出它的类型。...尽管ci是有const修饰的常量,但是变量i的类型是int类型,而非const int,因为此时i拷贝了ci的值,i和ci是两个不相关的变量,分别有不同的存储空间,变量ci不可修改的属性不代表变量i也不可修改...这意味着原本在32位系统上运行良好的代码可能在64位的系统上运行异常,如果这里用auto来定义变量,则可以避免这种问题。...如果你用auto来替代上面的定义,则完全可以避免这样的问题发生,如: for (const auto& p : m) {} 新标准新增功能 自动推导函数的返回值类型(C++14) C++14标准支持了使用...类内初始化成员时不能使用auto 在C++11标准中已经支持了在类内初始化数据成员,也就是说在定义类时,可以直接在类内声明数据成员的地方直接写上它们的初始值,但是在这个情况下不能使用auto来声明非静态数据成员
不能直接访问对象中的 _size 和_capacity,一方面是因为这是私有成员变量;另一方面,就算声明了友元函数,C++标准中并没有规定_size和_capacity的具体名称,因此不同编译器中的这两个变量的名称可能不同...,如果直接在代码中访问成员变量,会使代码的可移植性变差。...这个接口的意义是减少扩容带来的损耗,编译器在创建一个 string 实例化对象时,并不知道它最终会存储多少数据,因此使用过程中不可避免地需要扩容,而我们知道扩容是有效率损耗的(如果原来的地址后面的空间不足...pos); const char& operator[] (size_t pos) const; 其重载的返回值均为下标指向元素的引用,只是如果对象被const修饰不可修改,那么其返回的引用也不可修改...append() 的作用就是在原来字符串的后面追加元素(如字符串等)。 operator+= (重要!!)
在C 语言中,如果函数需要修改变量的值,参数必须为指针,如int foo(int *pval),在 C++ 中,函数还可以声明引用参数int foo(int &val),定义引用参数防止出现 (*pval...宏意味着你和编译器看到的代码是不同的。这可能会导致异常行为,尤其因为宏具有全局作用域。值得庆幸的是,C++ 中,宏不像在 C 中那么必不可少。以往用宏展开性能关键的代码,现在可以用内联函数替代。...C++11 中,若变量被声明成 auto,那它的类型就会被自动匹配成初始化表达式的类型。您可以用 auto 来复制初始化或绑定引用。...p = {1,2}; 从C++11开始,该特性得到进一步的推广,任何对象类型都可以被列表初始化。...优点: Boost代码质量普遍较高,可移植性好,填补了 C++ 标准库很多空白,如型别的特性,更完善的绑定器,更好的智能指针。
从C++0x到C++11,C++标准10年磨一剑,第二个真正意义上的标准姗姗来迟。...student s3{ "李四","123456" }; return 0; } initializer_list容器 C++11中新增了initializer_list容器,该容器没有提供过多的成员函数...最好也增加一个以initializer_list作为参数的赋值运算符重载函数,以支持直接用列表对容器对象进行赋值,但实际也可以不增加。...类型元素的array容器 return 0; } array容器与普通数组对比: array容器与普通数组一样,支持通过[]访问指定下标的元素,也支持使用范围for遍历数组元素,并且创建后数组的大小也不可改变...用[]访问元素时采用断言检查,调用at成员函数访问元素时采用抛异常检查。 而对于普通数组来说,一般只有对数组进行写操作时才会检查越界,如果只是越界进行读操作可能并不会报错。
C++发展历史 C++11是C++语言的第二个主要版本,也是自C++98以来最重要的一次更新。它引入了大量的新特性,标准化了已有的实践,并极大地改进了C++程序员可用的抽象能力。...C++03与C++11之间间隔了8年,这是C++版本发布史上最长的一次。从那时起,C++社区每三年发布一次新标准,保持了更加稳定的更新节奏。...对象,然后调用拷贝构造函数复制给d1。...容器类(如vector)的构造函数和赋值运算符都增加了接受std::initializer_list的版本,因此可以直接使用{}进行初始化。...std::initializer_list的作用 初始化容器 C++11中的标准容器(如std::vector、std::list、std::map等)都增加了接受std::initializer_list
领取专属 10元无门槛券
手把手带您无忧上云