Questions tagged «c++»

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

1
C ++ 11支持高阶列表功能
大多数函数式编程语言(如Common Lisp的,计划/球拍,Clojure中,Haskell中,斯卡拉,ocaml的,SML)支持列出了一些常见的高阶功能,如map,filter,takeWhile,dropWhile,foldl,foldr(见如Common Lisp的,计划/球拍, Clojure并排参考表,Haskell,Scala,OCaml和SML文档。) C ++ 11是否在列表上具有等效的标准方法或函数?例如,考虑以下Haskell代码段: let xs = [1, 2, 3, 4, 5] let ys = map (\x -> x * x) xs 如何在现代标准C ++中表达第二个表达式? std::list<int> xs = ... // Initialize the list in some way. std::list<int> ys = ??? // How to translate the Haskell expression? 上面提到的其他高阶函数呢? …

4
C ++和Java中的抽象类/接口是否有不同的用法依据
根据Herb Sutter的说法,应该更喜欢抽象接口(所有纯虚函数)而不是C ++中的抽象类,以尽可能地实现分离。虽然我个人认为该规则非常有用,但是最近我加入了一个由许多Java程序员组成的团队,并且在Java代码中似乎没有该准则。函数及其实现通常位于抽象类中。因此,即使对于C ++,我也将Herb Sutter弄错了吗?还是与Java相比,C ++中抽象函数的用法是否存在一般差异?在Java中,带有实现代码的抽象类比在C ++中更明智吗?如果是,为什么呢?

7
单例,抽象类和接口的作用是什么?
我正在学习C ++中的OOP,即使我知道这3个概念的定义,我也无法真正意识到何时或如何使用它。 让我们以此类为例: class Person{ private: string name; int age; public: Person(string p1, int p2){this->name=p1; this->age=p2;} ~Person(){} void set_name (string parameter){this->name=parameter;} void set_age (int parameter){this->age=parameter;} string get_name (){return this->name;} int get_age (){return this->age;} }; 1. 单身人士 类的限制如何只有一个对象起作用? CAN你设计一个类,将有只有 2个实例?也许3? 何时 /建议何时使用单例?这是好习惯吗? 2. 抽象类 据我所知,如果只有一个纯虚函数,则该类将变为抽象。因此,添加 virtual void print ()=0; 会做到的,对吧? 为什么需要一个不需要其对象的类? …

3
我们可以从std :: string的c_str()获得什么性能?总是恒定的时间?
我最近一直在做一些必要的优化。我一直在做的一件事是更改一些ostringstreams-> sprintfs。我正在将一堆std :: strings冲刺到ac样式数组,ala char foo[500]; sprintf(foo, "%s+%s", str1.c_str(), str2.c_str()); 事实证明,Microsoft的std :: string :: c_str()实现在恒定时间内运行(它只返回一个内部指针)。看来libstdc ++也是一样。我意识到std不能保证c_str,但是很难想象另一种方式。例如,如果他们将其复制到内存中,要么不得不为缓冲区分配内存(将其留给调用方销毁,而不是STL合同的一部分),要么必须将其复制到内部静态对象中。缓冲区(可能不是线程安全的,并且您无法保证其寿命)。因此,仅返回指向内部维护的以null终止的字符串的指针似乎是唯一可行的解​​决方案。

7
C ++中是否存在通用的大写约定?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 5年前关闭。 我在Python和Java上做了很多工作,并且这两种语言都有关于标识符中如何使用大写字母的相当通用(尽管不是通用的)约定:都PascalCase用于类名和ALL_CAPS“全局”常量,但用于其他标识符很多Java代码使用,mixedCase而很多Python代码使用underscore_delimiters。我知道没有语言或库会强制使用任何特定的大写字母,但是我发现当我坚持使用的语言的标准约定时,我的代码似乎更具可读性。 现在,我正在用C ++启动一个项目,并且我想应用相同的想法。我应该了解任何最常见的大写约定吗?

7
C#经验能否很好地转换为C ++?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 5年前关闭。 我在学校的编程课是C ++,但是最近几年我最终从事C#工作。如果某个职位要求说1或2年C ++经验,那么我在C#方面的经验值得考虑吗?我担任这样的职位有多有效?那么,我是否需要以入门级C ++程序员的身份开始学习以获得必要的经验?
13 c#  c++  experience 

9
用C ++重写IBM汇编器+ COBOL
我是一家汽车租赁公司的出租代理/经理,该公司在1972年编写的出租系统上运行。我决定也许是时候进行更新了。作为一点背景,下面是我们每天必须从此程序中处理的疯狂的简短示例: 租赁代理商必须记住,在一个屏幕上进行打印时,在ACT字段中使用“ MXC”(所有内容均基于短代码),这令人困惑地表示“在合同上显示最大数量”,而在另一个屏幕上则需要PR(对于PRint)。 ACTION字段,但有几个屏幕在PT(对于PrinT)字段中使用Y,而另一个屏幕在PRT(对于PRinT)字段中使用Y,而另一个屏幕要求用户点击Enter(但不点击字母,因为这是换行符,必须是数字键盘上的回车键),然后是F8,一个不同但相关的屏幕仅需F8,某些屏幕上有一个标有PRT的字段,该字段应用于PRinT,但实际上该字段什么也不做,经过几次提示后,打印会自动完成,还有更多屏幕带有标有PRINT Y / N的字段,对于其他地点已经交付文书工作的操作,默认为Y;对于其他经销商将需要文书工作的操作,默认为N。 我决定可以做得更好,因此我决定与公司中的负责该更新的人联系。我最终与负责该计划的IT副总裁取得了联系。我从他那里得到了一些信息,并且得知我的汽车租赁公司的租赁程序是用IBM大型机组装程序编写的,其中混入了一些COBOL。他说,目前没有职位空缺,但是我应该无论如何,请给他发送我的简历给他(以防万一)。 这使我想到了我的问题。 首先是技术。考虑到将来改善可维护性的想法,我的想法是用比汇编语言更高级的语言来重写它。我的经验领域是C ++,因此这对我来说是显而易见的选择。该公司迫切需要一种更简便的方法来更新程序,正如我最近读到一篇文章时所引用的,当时与我交谈的那个人说,该团队工作很努力,他们很自豪地宣布该程序现在支持5位数字的位置代码(而不是4)和8位的车号(而不是7)。我的更新哲学,即使在这种可怕的情况下,也符合乔尔的观点:http : //www.joelonsoftware.com/articles/fog0000000069.html简而言之,重写应该是渐进式的,而不是扔掉以前的一切然后重新开始。 有没有一种简便的方法可以将IBM Assembly与C ++集成在一起,如果可以,该怎么办?我隐约知道了asm关键字,但是我不知道最好使用它还是做其他事情。这样的计划不明智吗?我在使用g ++和GNU make的Linux上完成大部分工作,因此欢迎您回答特定的答案,但绝对不需要(因为我不知道它们没有哪种构建系统,但我怀疑几乎没有)。 第二个问题更具政治性。我应该如何说服该公司他们需要进行转换?理论上的成本节省是巨大的(根据我的估计,该公司每年在浪费额外的百万美元左右,仅是增加了学习如何与该程序交互的培训成本),但是我建议的更改可能会将所有当前的程序员失业,应该将他们制定出来,因此存在很大的结构性变革阻力。 编辑:我应该解释为什么我修改公司已经拥有的东西对我来说似乎是最好的解决方案。我仍然愿意接受其他建议,因为这是程序的庞然大物。我以前从未从事过编程工作,因此请对我可能给出的任何错误分析进行更正。 首先,有现成的解决方案。 从我与几位中层管理人员的讨论中,切换到新系统的主要问题之一是,许多忠诚的员工已经在公司工作了数十年,并且对系统很满意。 。如果我有能力修改已有的内容,则可以将当前接口保持为某种“兼容模式”。用户已经必须登录才能使用当前系统,因此我可以添加在用户首次登录(在我进行此更改之后)时激活设置的功能,在此用户可以选择使用“经典”界面或“新”界面。我无法找到一种现成的解决方案来实现这一目标, 我公司还拥有我们使用的软件;我们不许可。这意味着我正在与之交谈的管理层实际上是可以授权我进行更改的同一个人。使用第三方解决方案,除了获得开发我们所使用产品的公司的必要权利外,我还必须获得公司的批准,这增加了另外的障碍。这还需要说服公司放弃“他们的”产品并购买其他产品,这似乎比尝试更新我们现有的产品更大的障碍,但是在这个问题上我很可能是错误的。 最后,展望未来,我不仅要改善用户界面并修复一些错误。在更新了这些“紧急”问题之后,我希望更新与技术相关的公司运营的基本方式。在这类问题上花了1-2年的时间后,我的计划是回到管理层并提出更重大的变化。公司目前有很多方法可以通过根本不使用的技术从根本上加以改善。例如,每个区域几乎都以相同的方式运行。当地的主要机场是分发汽车的中央枢纽。它们主要按需要发送。但是,机场被用作所有行动的基地。他们会用一辆车派两个人到我的位置,从我们这里接我们不需要的车,然后带着他们进来的汽车返回机场,再加上他们要收回的东西(我们距机场32英里)。然后,他们将乘坐两辆车到达距离我们5英里的位置,将其中一辆降下,然后将另一辆车返回机场。即使我们退还的汽车与他们在我们附近所需的汽车相同,他们也会这样做。我已经在该公司工作了大约两年,而我似乎只在最极端的汽车短缺紧急情况下才偏离了这一点(大约有过三次)。我将用一个自动调度系统代替在每个地区工作的4个人,该系统可以确定要去哪辆汽车,并尝试找到所需的时间最少的里程+里程+驾驶员来将所有汽车交付到需要的位置。我希望有一天可以添加更高级别的修复示例。 但是,在我提出所有建议之前,我认为通过执行较小的任务(例如更新接口)来了解公司和代码库将很有帮助。诸如外包或其他方式的解决方案将消除这种可能性。

6
“解释RAII习惯用法”是一个很好的C ++筛选问题吗?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 5年前关闭。 与我合作的一家公司要求我进行候选电话筛选,以确保在将某人转移给潜在客户时不会完全让他们感到尴尬。 事实证明,有相当多的人被安排担任C ++开发人员角色。我并没有花太多时间在C ++上,但是我已经用该语言完成了一些琐碎和琐碎的项目。我认为“解释RAII习惯用语”将是一个不错的垒球问题,大多数严肃的C ++开发人员都可以在半睡着时回答,并且可以让我继续讨论有关经验的更有趣的问题。但是事实证明,即使我将首字母缩写词扩展为“资源获取就是初始化”,具有10年以上C ++经验的人也不认识该术语。一位候选人甚至说,他认为在Windows开发中应用该技术并不总是可行的,我认为这是一个奇怪的想法,但我可以看到几个可以支持该思路的示例。)。 甚至我认识的几个C ++开发人员都知道他们的能力,他们说他们不认识该术语,但是在阅读了该技术的摘要后说:“哦,是的,我不知道这个名字。我只是将这些事情视为您要做的事情。” 我记得Stroustrup的第二版中的术语,尽管当时并没有完全发挥作用。 因此,是“您能向我解释RAII的习惯用法吗?” 一个公平的筛选问题?期望所有有能力的C ++开发人员理解它是否合理?这个词比我想象的更神秘吗?假设候选人不知道该术语,是否有后续问题可以帮助我弄清楚他们是否至少已使RAII发挥作用的内在化?是否有更好的替代“杂草”问题使应试者有一定的自由度,并帮助应聘者证明他们对C ++开发的理解? 编辑要补充:澄清一下,我并不是那种使人们失去资格的面试官,因为他们不知道流行语和首字母缩写词。但是,我确实希望有经验的C ++程序员能够内部化资源管理的良好实践,这是合理的。我还认为,在继续进行有关设计,解决问题等更有趣的问题之前,验证候选人是否了解他们声称拥有专业技能的技术的“基础知识”非常重要。提出一个适用于简短电话筛选的开放式问题,在我提出“困难”问题之前,我可以用它来判断候选人对C ++中良好资源管理实践的基本理解。
13 c++  interview 

7
设计:回调到父类
在使用子对象对对象进行建模时,通常通过合成将子对象包括在内,作为父类的成员。但是有时候孩子需要告诉父母一些事情,他们需要调用父母的函数。使用C ++如何做到这一点?一些选项是: 使父类成为全局类,因此子对象将能够调用父对象的成员函数。 将父对象作为指针或引用注入到每个子对象中。然后,当子项需要告诉父对象某些内容时,它总是可以这样做,因为它具有可以使用的成员变量。 还有什么其他方法可以做到这一点?这种事情是否有通用的设计模式或名称? 请注意,我对C ++中的想法和解决方案感兴趣,因为在其他面向对象的语言中,细节将有所不同。例如,上面的第2点提到了“指针或引用”,并且两者都只能在C ++中使用。C ++具有其他语言没有的语言功能,因此解决该问题的方法的实现可能会合并这些语言功能,从而使该解决方案与某人使用另一种语言可能提出的解决方案有所不同。

4
在C / C ++中,应尽可能在参数和局部变量中使用'const'吗?
这个问题的灵感来自java中的一个问题final。 在C / C ++中,应const尽可能使用? 我知道已经有一个关于const在参数中使用的相关问题。不幸的是,这个问题及其答案不能完全回答我的问题,因为它仅与函数参数有关,但我也想了解其他情况(例如:局部变量)。 另外,几乎所有该问题的答案都说我们应该使用,const因为它包含有关变量可访问性的有用信息。但这似乎与在Java中使用final的答案相抵触,因为final如果其中不包含额外的信息,状态可能是多余的,因此应省略它以使代码简洁明了。 那么,我应该const尽可能使用吗?如果是这样,为什么constC ++中的建议final与Java中的建议不同?

3
匿名名称空间使代码不可测试
这是典型的C ++代码: foo.hpp #pragma once class Foo { public: void f(); void g(); ... }; foo.cpp #include "foo.hpp" namespace { const int kUpperX = 111; const int kAlternativeX = 222; bool match(int x) { return x < kUpperX || x == kAlternativeX; } } // namespace void Foo::f() { ... …
12 c++  unit-testing 

4
为什么将sizeof称为编译时运算符?
本来这是另一个问题的一部分。 为什么sizeof称为编译时运算符?它实际上不是运行时运算符吗?而且,如果它确实是一个编译时运算符,那么它如何帮助产生在不同计算机上运行相同代码的可移植代码?请详细说明。
12 c++ 

2
使用流操纵器(endl)还是换行符(\ n)?
我没有在特定的上下文中询问问题,但是在阅读有关C ++的初学者书籍时,我注意到在处理流对象时,既使用了endl流操纵器,也使用了换行符。 示例如下: cout << "Hello World" << endl; cout << "Hello World\n"; 我的问题是: 在特定情况下使用流操纵器(endl)并在其他情况下使用转义符是否更合适? 使用两者之一是否在效率方面存在弊端? 它们完全可以互换吗? 我读到一个转义序列作为单个字符存储在内存中。这是否意味着如果要降低内存消耗,使用endl更合适吗? 流操纵器endl是否以任何方式消耗内存,如果超过了转义序列,它会占用更多内存吗? 谢谢,StackExchange Apologies如果将其发布在错误的部分,我认为它已被视为数据结构。

2
如果派生类没有分配原始动态内存,为什么基类在这里需要有一个虚拟析构函数?
以下代码导致内存泄漏: #include <iostream> #include <memory> #include <vector> using namespace std; class base { void virtual initialize_vector() = 0; }; class derived : public base { private: vector<int> vec; public: derived() { initialize_vector(); } void initialize_vector() { for (int i = 0; i < 1000000; i++) { vec.push_back(i); } } }; …

1
使用朋友类封装C ++中的私有成员函数-好的做法还是滥用?
因此,我注意到可以通过执行以下操作来避免将私有函数放在标头中: // In file pred_list.h: class PredicateList { int somePrivateField; friend class PredicateList_HelperFunctions; public: bool match(); } // In file pred_list.cpp: class PredicateList_HelperFunctions { static bool fullMatch(PredicateList& p) { return p.somePrivateField == 5; // or whatever } } bool PredicateList::match() { return PredicateList_HelperFunctions::fullMatch(*this); } 私有函数永远不会在标头中声明,并且导入标头的类的使用者永远不需要知道它的存在。如果helper函数是模板,则这是必需的(替代方法是将完整的代码放在标头中),这就是我“发现”它的方式。如果添加/删除/修改私有成员函数,则不需要重新编译包含头文件的每个文件的另一个好处。所有专用功能都位于.cpp文件中。 所以... 这是一个众所周知的设计模式吗? 对我来说(来自Java / C#背景并且自己学习C …

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.