Questions tagged «c++»

有关C ++的问题,C ++是一种静态类型,自由格式,多范式,已编译的通用编程语言。

10
当与“ if”和“ while”一起使用时,为什么语言需要在表达式周围加上括号?
如C,Java中,和C ++语言在使用时都需要围绕整个表达式括号if,while或switch。 if (true) { // Do something } 相对于 if true { // Do something } 我觉得这很奇怪,因为括号是多余的。在此示例中,true是一个单独的表达式。括号不会以我所知的任何方式改变其含义。为什么存在这种奇怪的语法?为什么如此常见?我不知道有什么好处吗?

13
空保护每个取消引用的指针是否合理?
在一项新工作中,我在代码审查中被标记为这样的代码: PowerManager::PowerManager(IMsgSender* msgSender) : msgSender_(msgSender) { } void PowerManager::SignalShutdown() { msgSender_->sendMsg("shutdown()"); } 有人告诉我最后一个方法应为: void PowerManager::SignalShutdown() { if (msgSender_) { msgSender_->sendMsg("shutdown()"); } } 即,即使它是私有数据成员,我也必须对它进行NULL保护msgSender_。我很难克制自己,不能用粗话来形容我对这块“智慧”的感觉。当我要求解释时,我听到一系列恐怖故事,这些故事是关于某位初级程序员如何在某年内对类应该如何工作感到困惑的,并意外删除了一个他本不应该拥有的成员(然后将其设置为NULL之后) (显然)),并且在产品发布后,事情就在现场爆发。我们已经“学到了硬道理,相信我们”,最好NULL检查一下所有内容。 在我看来,这就像简单而简单的货物崇拜编程。一些好心的同事正在认真地尝试帮助我“了解它”,并了解这将如何帮助我编写更强大的代码,但是...我忍不住觉得自己是不了解它的人。 编码标准要求首先检查函数中解引用的每个指针NULL(甚至是私有数据成员)是否合理?(注意:为提供背景信息,我们生产的是消费类电子设备,而不是空中交通管制系统或其他“故障等同人员死亡”的产品。) 编辑:在上面的示例中,msgSender_协作者不是可选的。如果是NULL,则表明存在错误。传递给构造函数的唯一原因是PowerManager可以使用模拟IMsgSender子类进行测试。 简介:对此大家有一些非常好的答案,谢谢大家。我接受@aaronps的邮件是因为它简短。似乎有相当广泛的普遍同意: 强制规定NULL看守每一个复引用指针是矫枉过正,但 您可以通过使用参考(如果可能)或const指针来避开整个辩论,并且 assert语句是NULL警卫人员的更开明的选择,用于验证是否满足函数的前提条件。

3
为什么我们需要将私有成员放在标题中?
私有变量是一种向类用户隐藏复杂性和实现细节的方法。这是一个相当不错的功能。但是我不明白为什么在c ++中我们需要将它们放在类的标题中。我看到这有两个令人讨厌的缺点: 它使用户的标题杂乱无章 每当修改内部结构时,它将强制重新编译所有客户端库 此要求背后是否存在概念上的原因?仅仅是为了简化编译器的工作吗?
62 c++  headers 

10
仅将C ++编译器用于函数重载是不好的做法吗?
因此,我正在针对某个处理器使用C进行软件设计。该工具包包括编译C和C ++的功能。对于我正在做的事情,在这种环境下没有可用的动态内存分配,并且该程序总体上非常简单。更不用说该设备几乎没有处理器能力或资源。实际上,根本不需要使用任何C ++。 话虽这么说,我在一些地方进行函数重载(C ++的功能)。我需要发送几种不同类型的数据,并且不想使用printf带有某种%s(或其他任何一种)参数的样式格式。我见过有些人无法使用C ++编译器执行此操作printf,但就我而言,可以使用C ++支持。 现在,我确定可能会遇到一个问题,即为什么我需要重载一个函数。因此,我将尝试立即回答。我需要从串行端口传输不同类型的数据,所以我有一些重载,可以传输以下数据类型: unsigned char* const char* unsigned char const char 我只希望没有一种方法可以处理所有这些事情。当我呼吁我只是希望它传递出串行端口的功能,我没有很多资源的,所以我不想做几乎没有任何事情,但我的传送。 有人看到了我的程序,问我:“为什么要使用CPP文件?” 所以,这是我唯一的原因。那是不好的做法吗? 更新资料 我想回答一些问题: 解决您的困境的客观答案取决于: 如果使用C ++,可执行文件的大小是否会显着增加。 截至目前,可执行文件的大小占用了4.0%的程序内存(5248字节)和8.3%的数据内存(342字节)。也就是说,为C ++编译...我不知道对于C会是什么样子,因为我没有使用过C编译器。我确实知道该程序不会再增长了,所以对于资源的有限程度,我会说我还可以... 如果使用C ++,是否会对性能产生明显的负面影响。 好吧,如果有的话,我什么都没注意到...但是那又可能是为什么我问这个问题的原因,因为我不太了解。 代码是否可以在只有C编译器可用的其他平台上重用。 我知道,对此的答案肯定不是。实际上,我们正在考虑使用其他处理器,但仅考虑使用功能更强大的基于ARM的处理器(事实上,我所知道的所有处理器都具有C ++编译器工具链)。

7
在C ++中将作用域枚举用于位标志
一个enum X : int(C#)或enum class X : int(C ++ 11)是具有一个隐藏的内部场类型int,可容纳任何值。另外,X在枚举上定义了许多预定义的常量。可以将枚举转换为其整数值,反之亦然。在C#和C ++ 11中都是如此。 在C#中,按照Microsoft的建议,枚举不仅用于保存单个值,而且还用于保存标志的按位组合。此类枚举(通常但并非必须)用[Flags]属性修饰。为了简化开发人员的工作,按位运算符(OR,AND等)被重载,因此您可以轻松地执行以下操作(C#): void M(NumericType flags); M(NumericType.Sign | NumericType.ZeroPadding); 我是一位经验丰富的C#开发人员,但是现在仅对C ++进行了几天的编程,并且不了解C ++约定。我打算以与C#中使用的完全相同的方式使用C ++ 11枚举。在C ++ 11中,作用域枚举上的按位运算符没有重载,因此我想重载它们。 这引发了一场辩论,意见似乎在以下三种选择之间有所不同: 枚举类型的变量用于保存位字段,类似于C#: void M(NumericType flags); // With operator overloading: M(NumericType::Sign | NumericType::ZeroPadding); // Without operator overloading: M(static_cast<NumericType>(static_cast<int>(NumericType::Sign) | static_cast<int>(NumericType::ZeroPadding))); 但这会违背C ++ 11范围枚举的强类型枚举哲学。 如果要存储枚举的按位组合,请使用纯整数: void …

10
是更好的Show()+ Hide()或SetVisible(bool可见)?
有什么更好的,为什么?(从界面设计的角度来看): a)具有两个Show()和Hide()函数 b)具有一项SetVisible(bool visible)功能 编辑:例如,某些对象具有可见性状态,并且可以使用此功能对其进行更改。 c)向有三个Show(),Hide(),SetVisible(bool visible)功能
59 java  c++  interfaces 

9
std :: shared_ptr作为最后的手段?
我只是在观看“ Going Native 2012”流,并且注意到有关的讨论std::shared_ptr。听到Bjarne std::shared_ptr对此持否定态度,以及他的评论是当物体的寿命不确定时应将其用作“最后手段”时,我感到有些惊讶(我认为,他认为这种情况很少见)。 有人愿意进一步解释这一点吗?我们如何std::shared_ptr在没有安全的情况下进行编程并仍然可以安全地管理对象的生命周期?

13
未定义行为背后的哲学
C \ C ++规范为编译器以自己的方式实现提供了许多开放的行为。这里经常有很多问题被问到同样的问题,并且我们有一些很好的帖子: https://stackoverflow.com/questions/367633/what-are-all-the-common-undefined-behaviour-that-ac-programmer-should-know-abo https://stackoverflow.com/questions/4105120/what-is-undefined-behavior https://stackoverflow.com/questions/4176328/undefined-behavior-and-sequence-points 我的问题不是关于不确定行为是什么,还是真的不好。我确实知道该标准的危险和大多数相关的未定义行为引用,因此请不要发布有关该标准有多严重的答案。这个问题是关于为编译器实现留出许多行为的背后的哲学。 我读了一篇很棒的博客文章,指出性能是主要原因。我想知道性能是否是允许它的唯一标准,或者是否有其他因素会影响将事情开放给编译器实现的决定? 如果您有任何示例可以引用某个特定的未定义行为为编译器提供足够的优化空间,请列出它们。如果您知道性能以外的其他因素,请提供足够详细的答案。 如果您不理解该问题或没有足够的证据/来源来支持您的答案,请不要发布广泛猜测的答案。


11
Java的现代回顾
我从事编程已经有几年了,我从Java开始。在我那段时间里,我发现许多不同的来源声称Java在某种程度上是一种劣等语言。我很清楚每种语言都有其优点和缺点,但是我所读过的有关Java的很多东西似乎都是过时的。 Java劣势最常被引用的原因是它比其他本地编译语言(例如C ++)慢得多。许多人批评游戏设计师Notch(开发了Minecraft)使用Java,因为它显然缺乏性能部门。我知道Java的运行速度要慢得多,但是此后有了很多改进,尤其是JIT编译。 我今天想就Java作为一种语言获得一些客观的见解。所以我的问题分为四个部分。 性能。 一种。今天的Java速度与C ++相比如何? b。是否可以使用Java创建现代AAA标题? C。如果有的话,在哪些方面Java比C ++慢?(即数字运算,图形或周围所有图形) Java现在被视为编译语言还是解释语言? 自早期以来,已经解决了Java的一些主要缺点? Java有哪些主要缺点需要解决? 编辑: 只是为了澄清起见,我并没有制作Java vs C ++,显然平均而言,c ++的速度要比Java快一点。现在,我只需要比较一下Java作为语言的成熟度就可以了。由于c ++永远存在,我想我将是一个比较点。

9
可读性与可维护性,编写嵌套函数调用的特殊情况
我的嵌套函数调用的编码样式如下: var result_h1 = H1(b1); var result_h2 = H2(b2); var result_g1 = G1(result_h1, result_h2); var result_g2 = G2(c1); var a = F(result_g1, result_g2); 我最近转到了一个部门,该部门非常使用以下编码样式: var a = F(G1(H1(b1), H2(b2)), G2(c1)); 我的编码方式的结果是,在功能崩溃的情况下,Visual Studio可以打开相应的转储并指出发生问题的行(我特别担心访问冲突)。 我担心,如果因第一种方式编程的相同问题而导致崩溃,我将无法知道是哪个函数导致了崩溃。 另一方面,行上进行的处理越多,一页上得到的逻辑就越多,从而增强了可读性。 我的恐惧是正确的还是我缺少什么?总的来说,在商业环境中这是首选吗?可读性还是可维护性? 我不知道它是否相关,但是我们正在使用C ++(STL)/ C#。

7
为什么C ++中没有“最终”构造?
C ++中的异常处理仅限于try / throw / catch。与Object Pascal,Java,C#和Python不同,即使在C ++ 11中,该finally构造也尚未实现。 我已经看到很多有关“异常安全代码”的C ++文献。Lippman写道,异常安全代码是一个重要但高级而又困难的话题,超出了他的Primer的讨论范围-这似乎意味着安全代码不是C ++的基础。赫伯·萨特(Herb Sutter)在他的Exceptional C ++中为该主题投入了10章! 但是在我看来,如果finally实现了该构造,尝试编写“异常安全代码”时遇到的许多问题都可以很好地解决,从而使程序员可以确保即使在发生异常的情况下也可以恢复程序到安全,稳定,无泄漏的状态,接近资源分配和潜在问题代码的地步。作为一个经验丰富的Delphi和C#程序员,我使用try ..最终像大多数使用这些语言的程序员一样,在我的代码中广泛地进行了阻塞。 考虑到C ++ 11中实现的所有“风声”,我惊讶地发现“最终”仍然不存在。 那么,为什么finally从未在C ++中实现该构造呢?实际上,这不是一个很难理解或高级的概念,并且可以帮助程序员编写“异常安全代码”。
57 c++  exceptions 

7
为什么面对std :: string会有这么多的字符串类?
在我看来,许多更大的C ++库最终都创建了自己的字符串类型。在客户端代码,你要么必须使用从库中一个(QString,CString,fbstring等,我相信任何人都可以仅举几例)或保持标准型和一之间进行转换的库使用(其中大部分时间涉及至少一份)。 那么,是否存在某种特定的功能缺陷或某些错误之处std::string(就像auto_ptr语义不好一样)?它在C ++ 11中有变化吗?
56 c++ 

3
什么是lambda,为什么有用?[关闭]
到目前为止,我听说: λ演算 Lambda程式设计 Lambda表达式 Lambda函数 这似乎都与函数式编程有关... 显然它将被集成到C ++ 1x中,所以我现在可能会更好地理解它: http://en.wikipedia.org/wiki/C%2B%2B0x#Lambda_functions_and_expressions 有人可以简短地定义什么是lambda事物,并给出一个有用的地方吗?

15
为什么我们有后缀增量?
免责声明:我完全清楚前缀和后缀增量的语义。因此,请不要向我解释它们的工作原理。 阅读有关堆栈溢出的问题,我不禁注意到程序员一遍又一遍地被后缀增量运算符弄糊涂了。由此产生以下问题:是否存在用例后缀增量在代码质量方面真正受益的用例? 让我用一个例子来澄清我的问题。这是以下内容的超级简洁实现strcpy: while (*dst++ = *src++); 但这并不是我书中最能自我记录的代码(它会在理智的编译器上产生两个烦人的警告)。那么以下替代方案有什么问题呢? while (*dst = *src) { ++src; ++dst; } 然后,我们可以摆脱条件中令人困惑的分配,并获得完全无警告的代码: while (*src != '\0') { *dst = *src; ++src; ++dst; } *dst = '\0'; (是的,我知道,src并且dst在这些替代解决方案中将具有不同的结束值,但是由于strcpy在循环之后立即返回,因此在这种情况下无关紧要。) 后缀增加的目的似乎是使代码尽可能简洁。我只是看不到我们应该如何努力。如果这最初是关于性能的,那么今天它仍然有意义吗?
55 c++  c  postfix 

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.