c++-faq相关内容

什么是智能指针,什么时候应该使用?

什么是智能指针,什么时候应该使用? 解决方案 UPDATE 这个答案相当陈旧,因此描述了当时什么是“好",即 Boost 库提供的智能指针.从 C++11 开始,标准库已经提供了足够多的智能指针类型,所以你应该倾向于使用 std::unique_ptr, std::shared_ptr 和 std::weak_ptr. 还有 std::auto_ptr.它非常像一个作用域指针, ..
发布时间:2021-12-01 14:40:07 C/C++开发

C++ 容器的迭代器失效规则

C++ 容器的迭代器失效规则是什么? (注意:此问答是Stack Overflow 的 C++ 常见问题解答中的条目.元讨论关于问题本身应该发布在 开始所有的元问题这个,不在这里.) 解决方案 C++17 (所有参考资料均来自 CPP17 的最终工作草案 - n4659) 插入 序列容器 vector:函数insert、emplace_back、emplace、push_b ..
发布时间:2021-12-01 14:39:33 C/C++开发

为什么结构的 sizeof 不等于每个成员的 sizeof 之和?

为什么 sizeof 运算符返回的结构大小大于结构成员的总大小? 解决方案 这是因为添加了填充来满足对齐约束.数据结构对齐影响程序的性能和正确性: 未对齐的访问可能是一个硬错误(通常是SIGBUS). 未对齐的访问可能是软错误. 在硬件中进行更正,以适度降低性能. 或者通过在软件中模拟来纠正严重的性能下降. 此外,原子性和其他并发性保证可能会被破坏,从而导致细微的错误. ..
发布时间:2021-12-01 14:39:18 C/C++开发

C++中的指针变量和引用变量有什么区别?

我知道引用是语法糖,所以代码更容易阅读和编写. 但是指针变量和引用变量有什么区别? 解决方案 一个指针可以重新赋值: int x = 5;整数 y = 6;国际*p;p = &x;p = &y;*p = 10;断言(x == 5);断言(y == 10); 引用不能重新绑定,必须在初始化时绑定: int x = 5;整数 y = 6;国际&q;//错误int &r = x; ..
发布时间:2021-12-01 14:39:02 C/C++开发

解决由于类之间的循环依赖导致的构建错误

我经常发现自己在 C++ 项目中面临多个编译/链接器错误,这是由于一些糟糕的设计决策(由其他人:))导致不同头文件中的 C++ 类之间的循环依赖(也可以发生在同一个文件中).但幸运的是(?)这种情况发生的频率并不高,我无法在下次再次发生时记住该问题的解决方案. 所以为了以后方便回忆,我将发布一个有代表性的问题和一个解决方案.当然欢迎更好的解决方案. A.h B 类;A级{int_va ..
发布时间:2021-12-01 14:38:47 C/C++开发

什么是复制省略和返回值优化?

什么是复制省略?什么是(命名的)返回值优化?它们意味着什么? 它们会在什么情况下发生?什么是限制? 如果有人提到过这个问题,您可能正在寻找简介. 有关技术概述,请参阅标准参考. 请参阅常见案例此处. 解决方案 简介 有关技术概述 - 跳至此答案. 对于发生复制省略的常见情况 - 跳至此答案. 复制省略是大多数编译器实现的优化,用于在某些情况下防止额外的(可 ..

在 C++ 标识符中使用下划线的规则是什么?

在 C++ 中,用某种前缀命名成员变量是很常见的,以表示它们是成员变量,而不是局部变量或参数.如果您有 MFC 背景,您可能会使用 m_foo.我也偶尔看到 myFoo. C#(或可能只是 .NET)似乎推荐只使用下划线,如 _foo.C++ 标准允许这样做吗? 解决方案 规则(在 C++11 中没有改变): 保留在任何范围内,包括用作实现宏: 以下划线开头的标识符,后跟大写 ..
发布时间:2021-12-01 14:37:13 C/C++开发

为什么我不应该#include ?

我用我的代码发布了一个问题,其唯一的 #include 指令如下: #include 我的老师告诉我这样做,但在评论部分我被告知我不应该这样做. 为什么? 解决方案 In包括 似乎是 Stack Overflow 上越来越常见的东西,也许是新添加的东西本学年的国家课程. 我认为这些优势是模糊的: 你只需要写一行#include 您无需查找所有内容所在的标准标题 ..

我必须将“模板"放在哪里以及为什么要放?和“类型名称"关键词?

在模板中,我必须将 typename 和 template 放在从属名称的何处以及为什么? 究竟什么是从属名称? 我有以下代码: template //Tail 也将是一个 UnionNode.struct UnionNode : 公共尾{//...模板结构体联合{//Q: 这里在哪里添加类型名/模板?typedef Tail::inUnion假的;};模板{};};模板 //对于最后一 ..
发布时间:2021-12-01 14:36:41 C/C++开发

运算符重载的基本规则和习惯用法是什么?

注意:答案以特定顺序给出,但由于许多用户根据投票而不是给出时间对答案进行排序,这里是索引按照最有意义的顺序回答: C++ 中运算符重载的一般语法 C++ 中运算符重载的三个基本规则 会员与非会员之间的决定 重载的常用运算符 赋值运算符 输入和输出运算符 函数调用运算符 比较运算符 算术运算符 数组下标 类指针类型的运算符 转换运算符 重载新建和删除 (注意: ..
发布时间:2021-12-01 14:36:22 C/C++开发

为什么 iostream::eof 在循环条件(即`while (!stream.eof())`)中被认为是错误的?

我刚刚在 这个 回答说在循环条件中使用 iostream::eof 是“几乎肯定是错误的".我通常使用诸如 while(cin>>n) 之类的东西 - 我猜它会隐式检查 EOF. 为什么使用 while (!cin.eof()) 显式检查 eof 是错误的? 它与在 C 中使用 scanf("...",...)!=EOF 有什么不同(我经常使用没有问题)? 解决方案 因为 io ..
发布时间:2021-12-01 14:36:05 C/C++开发

为什么“使用命名空间 std;"被认为是不好的做法?

其他人告诉我,在代码中编写 using namespace std; 是错误的,我应该使用 std::cout 和 std::cin 直接代替. 为什么 using namespace std; 被认为是一种不好的做法?它是低效的还是有风险声明不明确的变量(与 std 命名空间中的函数同名的变量)?它会影响性能吗? 解决方案 这与性能完全无关.但请考虑一下:您正在使用两个名为 Foo ..
发布时间:2021-12-01 14:35:51 C/C++开发

什么是未定义的引用/未解析的外部符号错误以及如何修复它?

什么是未定义的引用/未解析的外部符号错误?什么是常见原因以及如何修复/预防它们? 解决方案 按照 2.2 (感谢 Keith Thompson 供参考): 翻译语法规则之间的优先级由以下阶段指定[见脚注]. 物理源文件字符以实现定义的方式映射到基本源字符集(为行尾指示符引入换行符)如果必要的.[SNIP] 每个反斜杠字符 (\) 后面紧跟一个换行符的实例都被删除,将物理源行拼 ..

权威 C++ 书籍指南和列表

这个问题试图收集每年出版的几十本 C++ 糟糕书籍中的少数珍珠. 与许多其他编程语言不同,这些语言经常从 Internet 上的教程中随时学习,很少有人能够在不学习写得很好的 C++ 书籍的情况下快速掌握 C++.这样做太庞大和复杂了.事实上,它是如此庞大和复杂,以至于有很多非常糟糕的 C++ 书籍.我们不是在谈论糟糕的风格,而是在谈论明显的事实错误和宣传极坏的编程风格. 请编辑接受的 ..
发布时间:2021-12-01 14:35:29 C/C++开发

什么是复制和交换习语?

这个成语是什么,什么时候用?它解决了哪些问题?使用 C++11 时习语会发生变化吗? 虽然在很多地方都提到过,但我们没有任何单一的“它是什么"的问题和答案,所以就在这里.这是之前提到的地方的部分列表: 您最喜欢的 C++ 编码风格习语是什么:复制交换 复制C++ 中的构造函数和 = 运算符重载:是否可以使用通用函数? 什么是复制省略和它如何优化复制和交换习语 C++:动态分配对象 ..

如何在现代 C++ 中实现经典的排序算法?

来自 C++ 标准库的 std::sort 算法(及其表亲 std::partial_sort 和 std::nth_element)是在大多数实现中更多基本排序算法的复杂和混合合并,例如选择排序、插入排序、快速排序、合并排序,或堆排序. 这里和姐妹网站(例如 https://codereview.stackexchange.com/)上有许多与错误、复杂性相关的问题以及这些经典排序算法实现 ..
发布时间:2021-11-26 23:51:12 C/C++开发

如何在 C++ 中使用数组?

C++ 从 C 继承了数组,它们几乎无处不在.C++ 提供了更易于使用且不易出错的抽象(std::vector 自 C++98 和 std::array 自 C++11),因此对数组的需求不像在 C 中那样频繁出现.但是,当您阅读遗留代码或交互时使用 C 语言编写的库,您应该牢牢掌握数组的工作原理. 这个常见问题分为五个部分: 类型级别的数组和访问元素 数组创建和初始化 赋值和参数 ..
发布时间:2021-11-18 00:50:37 C/C++开发

什么是< =>(C ++)中的(“太空飞船",三向比较)运算符?

当我尝试学习 C ++ 运算符时,我偶然发现了 cppreference.com , * : 和 C ++ 之间是否存在联系? 如果有的话,这个运算符的作用是什么? *同时cppreference.com更新了该页面,现在包含有关 运算符的信息. 解决方案 在的建议,作为添加到 C ++ 20 的新功能之一.在标题为一致比较萨特的论文中,Maurer和B ..
发布时间:2021-04-19 18:37:50 C/C++开发