[Effective modern cpp]现代c++区别

本文探讨了现代C++编程的一些关键区别和最佳实践,包括使用()和{}创建对象的差异,空指针 nullptr 的优势,别名声明的优先级,限定作用域枚举的使用,delete函数的策略,override声明的必要性,noexcept声明的意义,以及constexpr的应用。同时,还详细解释了特种成员函数的生成机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

创建对象时使用()和{}的区别

1、大括号可以指定容器的初始内容>。

std::vector<int> v{
   
   1,3,5}

2、大括号可以用来为非静态成员指定默认初始化值,也可以用’='的初始化语法,不能用()。

class Widget{
   
   
  ...
private:
  int x{
   
   0};//可行
  int y = 0;//可行
  int z(0);//不可行
}

3、不可复制对象(只移类型)可以用大括号小括号进行初始化,却不能使用"=":

std::atomic<int> ai1{
   
   0};
std::atomic<int> ai2(0);
std::atomic<int> ai3 = 0;//不可行

4、大括号禁止內建型别之间进行隐式窄化型别转换,小括号和=不会进行隐式窄化类型检查。

double x,y,z
<think>好的,用户现在想了解《Effective Modern C++》这本书。之前他们问过C++新特性,我给出了一些版本特性的总结,现在他们可能想深入学习和应用这些特性,需要一本好的学习资料。 首先,我需要确认用户的需求。他们可能已经知道C++11/14/17等的新特性,但需要如何正确高效地使用这些特性的指导。Effective Modern C++正好是Scott Meyers写的,专门讲这方面的最佳实践,所以用户可能想了解这本书的结构、内容以及是否适合他们。 接下来,用户可能没有直接说出的是他们的实际水平。如果他们已经看过我之前的回答,可能对C++有一定的基础,但希望提升到现代C++的实践层面。需要强调这本书适合有一定C++基础,想要进阶的开发者。 然后,我需要介绍这本书的核心内容,比如条款数量、重点覆盖的特性,比如类型推导、智能指针、移动语义、lambda等,这些都是现代C++的关键点。还要提到这本书的写作风格,Scott Meyers以清晰易懂著称,所以应该指出这一点。 用户可能还想知道这本书是否有中文版,或者是否有电子版,但根据已有信息,暂时不需要回答这些,但可以建议他们查阅相关资源,比如C++ Reference或者在线文档。 另外,需要结合之前用户的问题,他们之前问的是新特性,现在这本书是关于如何有效使用这些特性,所以可以强调这本书如何帮助他们避免常见错误,写出更高效、安全的代码。比如智能指针的使用陷阱,移动语义的正确应用等。 可能还需要提到这本书的章节结构,比如分为类型推导、智能指针、右值引用等部分,这样用户能清楚书的内容组织。同时,给出一些具体的例子,比如auto和decltype的区别,或者完美转发的使用,这样用户能更直观地理解书中的内容。 最后,要给出学习建议,比如建议边读边实践,结合项目应用,或者参考其他资源。用户可能是在自学,或者准备面试,需要高效地掌握这些知识点,所以强调实践的重要性。 需要避免的是过于冗长的介绍,保持信息结构清晰,分点列出,让用户容易阅读。同时,确保没有错误信息,比如正确引用书中的条款和例子,避免误导用户。当然</think>可以! **《Effective Modern C++》** 是由 C++ 专家 **Scott Meyers** 撰写的经典书籍,专注于教授如何高效、安全地使用 **C++11 和 C++14** 的新特性。书中通过 **42 条实用条款**,帮助开发者规避陷阱,写出更现代化的 C++ 代码。 --- ### **核心内容概览** #### **1. 类型推导 `auto`(条款1-4)** - **`auto` 的优势**:避免类型冗余,减少错误。 - **类型推导规则**:区分 `auto` 模板类型推导的差异。 - **示例**: ```cpp auto x = {1, 2}; // x 推导为 std::initializer_list<int> template<typename T> void f(T param); f({1, 2}); // 错误!模板无法推导 initializer_list ``` #### **2. 智能指针资源管理(条款18-22)** - **`std::unique_ptr`**:独占所有权,轻量高效。 - **`std::shared_ptr`**:共享所有权,注意循环引用(搭配 `weak_ptr` 解决)。 - **示例**: ```cpp auto p = std::make_unique<int>(42); // 优先使用 make_unique std::shared_ptr<Widget> sptr(new Widget, customDeleter); // 自定义删除器 ``` #### **3. 右值引用移动语义(条款23-29)** - **移动语义的意义**:避免不必要的深拷贝(如临时对象传递)。 - **完美转发**:`std::forward` 保持值类别(左值/右值)。 - **示例**: ```cpp void process(Widget&& w); // 仅接受右值 template<typename T> void relay(T&& arg) { // 万能引用 process(std::forward<T>(arg)); // 完美转发 } ``` #### **4. Lambda 表达式(条款31- **闭包的生命周期管理**:注意捕获变量的悬空引用。 - **初始化捕获(C++14)**:移动捕获的替代方案。 - **示例**: ```cpp auto func = [data = std::move(data)] { /* 使用移动后的 data */ }; // C++14 初始化捕获 ``` #### **5. 并发多线程(条款35-40)** - **`std::thread` `std::async`**:任务启动策略的选择。 - **原子操作内存序**:理解 `std::atomic` 和内存模型。 - **示例**: ```cpp std::future<int> fut = std::async(std::launch::async, computeValue); ``` --- ### **书中的经典建议** 1. **优先使用 `const_iterator` 而非 `iterator`**(条款13)。 2. **用 `std::call_once` 替代静态局部变量初始化**(解决线程安全问题,条款16)。 3. **避免重载万能引用模板函数**(条款26:可能导致意外匹配)。 4. **理解 `std::move` 和 `std::forward` 的区别**(条款23)。 --- ### **适合读者** - 已掌握 C++ 基础,希望深入 **现代 C++C++11/14)** 的开发者。 - 需要避免新特性误用(如错误使用移动语义、智能指针泄漏)的进阶者。 --- ### **其他书籍的对比** - **《Effective C++》**:聚焦传统 C++ 的最佳实践。 - **《Effective Modern C++》**:专注 C++11/14 新特性,前作互补。 --- ### **学习建议** 1. **边读边实践**:通过代码验证条款中的观点。 2. **结合官方文档**:查阅 [C++ Reference](https://en.cppreference.com) 理解标准库细节。 3. **关注 C++17/20 扩展**:书中未覆盖更新标准,需补充学习(如概念、协程)。 如果需要具体条款的代码示例或解释,可以告诉我! 😊
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值