Questions tagged «c++»

C ++是一种通用编程语言。它最初被设计为C的扩展,并且具有类似的语法,但是现在它是一种完全不同的语言。使用此标记可解决有关将要使用C ++编译器编译的代码的问题。对于与特定标准修订版[C ++ 11],[C ++ 14],[C ++ 17]或[C ++ 20]等相关的问题,请使用特定于版本的标记。


5
const引用类成员是否可以延长临时对象的寿命?
为什么这样做: #include <string> #include <iostream> using namespace std; class Sandbox { public: Sandbox(const string& n) : member(n) {} const string& member; }; int main() { Sandbox sandbox(string("four")); cout << "The answer is: " << sandbox.member << endl; return 0; } 给出以下输出: 答案是: 代替: 答案是:四

13
在C ++中,我是否要为自己不吃的东西付费?
让我们考虑以下C和C ++的世界示例: main.c #include <stdio.h> int main() { printf("Hello world\n"); return 0; } main.cpp #include <iostream> int main() { std::cout<<"Hello world"<<std::endl; return 0; } 当我将它们编译为汇编时,C代码的大小只有9行(gcc -O3): .LC0: .string "Hello world" main: sub rsp, 8 mov edi, OFFSET FLAT:.LC0 call puts xor eax, eax add rsp, 8 ret 但是C ++代码的大小为22行(g++ -O3): …
170 c++  c 


5
当operator&重载时,如何可靠地获取对象的地址?
考虑以下程序: struct ghost { // ghosts like to pretend that they don't exist ghost* operator&() const volatile { return 0; } }; int main() { ghost clyde; ghost* clydes_address = &clyde; // darn; that's not clyde's address :'( } 我如何获得clyde的地址? 我正在寻找一种适用于所有类型对象的解决方案。C ++ 03解决方案会不错,但我也对C ++ 11解决方案感兴趣。如果可能,让我们避免任何特定于实现的行为。 我知道C ++ 11的std::addressof功能模板,但对在这里使用它不感兴趣:我想了解标准库实现者如何实现此功能模板。

6
C ++ 11、14、17或20是否为pi引入标准常数?
在C和C ++中,数字pi存在一个相当愚蠢的问题。我所知道的M_PImath.h,任何标准都不要求定义。 新的C ++标准在标准库中引入了许多复杂的数学运算-双曲函数std::hermite和std::cyl_bessel_i,不同的随机数生成器等。 是否有任何“新”标准为pi引入常数?如果没有-为什么?没有它,所有这些复杂的数学如何工作? 我知道有关C ++中pi的类似问题(它们已有好几年历史了,并且已经成为标准)。我想知道问题的当前状态。 我也对为什么 C ++仍然没有pi常量但具有很多更复杂的数学的原因非常感兴趣。 UPD:我知道我可以将pi定义为4 * atan(1)或acos(1)或double pi = 3.14。当然。但是为什么在2018年我仍然必须这样做?没有pi的标准数学函数如何工作? UPD2:根据这个在科隆在2019年7月C ++委员会会议之行报告,建议P0631(数学常数)被接纳进入C ++ 20。这样看来,终于在标准库中有了数字pi了!



4
是否应将.vcxproj.filter文件添加到源代码管理中?
在评估Visual Studio 2010 Beta 2时,我看到在转换后的目录中,我的vcproj文件变成了vcxproj文件。每个项目旁边还有vcxproj.filter文件,这些文件似乎包含文件夹结构的描述(\ Source Files,\ Header Files等)。 您认为这些筛选器文件应按用户保留,还是应在整个开发人员组中共享并检入SCC? 我目前的想法是将它们检入,但是我想知道是否有任何理由不这样做,或者也许是为什么我一定要对其进行检入的充分理由。 明显的好处是,如果我查看其他人的计算机,则文件夹结构将匹配,但也许他们想按逻辑进行重组?

1
将双精度整数舍入为32位int的快速方法
在阅读Lua的源代码时,我注意到Lua使用a将a macro舍double入为32位int。我提取了macro,它看起来像这样: union i_cast {double d; int i[2]}; #define double2int(i, d, t) \ {volatile union i_cast u; u.d = (d) + 6755399441055744.0; \ (i) = (t)u.i[ENDIANLOC];} 这里ENDIANLOC定义为endianness,0对于小端,1对于大端。Lua会小心处理字节顺序。t代表整数类型,例如int或unsigned int。 我做了一些研究,有一个更简单的格式macro使用了相同的想法: #define double2int(i, d) \ {double t = ((d) + 6755399441055744.0); i = *((int *)(&t));} 或采用C ++样式: inline int double2int(double d) { …


2
公共朋友交换成员功能
在对复制和交换惯用语的漂亮回答中,有一段代码我需要一些帮助: class dumb_array { public: // ... friend void swap(dumb_array& first, dumb_array& second) // nothrow { using std::swap; swap(first.mSize, second.mSize); swap(first.mArray, second.mArray); } // ... }; 然后他加了一张纸条 还有其他一些主张,我们应该为我们的类型专门使用std :: swap,在提供免费交换功能的同时提供类内交换,等等。但这都是不必要的:对交换的任何正确使用都将通过不合格的调用,我们的功能将通过ADL找到。一种功能会起作用。 随着friend我对“不友好”的条款一点,我必须承认。因此,我的主要问题是: 看起来像一个自由函数,但是它在类体内? 为什么这不是swap静态的?它显然不使用任何成员变量。 “任何正确使用交换的方法都会通过ADL找出交换”?ADL将搜索名称空间,对吗?但是它也可以在类内部查看吗?还是在这里friend进来? 附带问题: 随着C ++ 11,我要记住我的swaps的noexcept? 随着C ++ 11和它的范围,对,我应该将friend iter begin()和friend iter end()在类中以同样的方式?我认为friend这里不需要这个,对吗?

6
在类中使用具有成员函数的通用std :: function对象
对于一个类,我想在一个map存储std::function对象中存储一些指向同一类成员函数的函数指针。但是我在使用此代码的开头就失败了: class Foo { public: void doSomething() {} void bindFunction() { // ERROR std::function<void(void)> f = &Foo::doSomething; } }; 我收到error C2064: term does not evaluate to a function taking 0 arguments的xxcallobj一些奇怪的模板实例化的错误结合。目前,我在使用Visual Studio 2010/2011的Windows 8上以及在VS10的Win 7上也失败。该错误必须基于一些我不遵循的奇怪C ++规则

3
默认构造函数和析构函数的“ = default”与“ {}”有何不同?
我最初将此问题仅发布为关于析构函数的问题,但现在我添加了对默认构造函数的考虑。这是原始问题: 如果我想给我的类一个虚拟的析构函数,但在其他方面与编译器生成的析构函数相同,则可以使用=default: class Widget { public: virtual ~Widget() = default; }; 但是似乎我可以通过使用空定义进行更少的键入而获得相同的效果: class Widget { public: virtual ~Widget() {} }; 这两种定义有什么不同的表现方式吗? 根据针对该问题发布的答复,默认构造函数的情况似乎类似。既然对于析构函数,“ =default”和“ {}”之间的含义几乎没有差异,那么对于默认构造函数,这些选项之间的含义几乎也没有差异吗?也就是说,假设我要创建一个将同时创建和销毁该类型的对象的类型,为什么我要说 Widget() = default; 代替 Widget() {} ? 如果在发布原始问题后再提出此问题违反了某些SO规则,我深表歉意。为默认构造函数发布一个几乎相同的问题令我震惊,因为它是不太理想的选择。

8
将类代码分为头文件和cpp文件
我对如何将简单类的实现和声明代码分成新的标头和cpp文件感到困惑。例如,如何分隔下一个类的代码? class A2DD { private: int gx; int gy; public: A2DD(int x,int y) { gx = x; gy = y; } int getSum() { return gx + gy; } };
169 c++  oop  class 

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.