我使用C++模板来传递策略函数器来改变我的函数的行为。它工作得很好。我传递的functor是一个没有存储的无状态类,它只是以经典的functor方式重载()运算符。
template <typename Operation> int foo(int a)
{
int b=Operation()(a);
/* use b here, etc */
}
我经常这样做,它工作得很好,而且我经常使用6到7个传入的模板化函数来制作模板!
然而,我既担心代码的优雅,也担心效率。函数器是无状态的,所以我假设Operation()构造函数是免费的,函数器的计算与内联函数一样有效,但像所有C++程
我已经试着学了大约一个月的C++,它仍然困扰着我。例如,这段“容易”的代码:
class A
{
int m;
public:
A() = default;
int getM() { return m; }
};
class B
{
int m;
public:
// empty body and empty initializer list
B() {} // isn't this the same as "B() = default;" ?
int getM() { return m; }
};
int
我在C++中有一个basic程序,它列出了给定数量的质数。完成这项工作的类如下所示-我的问题是,当"amount“的输入是10 (特别是10 -它对我尝试过的所有其他数字都很好)时,下面生成的数组不会初始化为零的数组。因此,“数组的最后一个元素为空”返回false,并且我的代码不能正常运行。
我不知道我是否误解了,但是int数组不应该初始化为零吗?如果不是,整数10有什么特殊之处,导致它初始化为奇怪的值?
int* primecalc(int amount) {
int* primes = new (nothrow) int [amount];
//Throw an error i
我知道,对于非POD类型的默认初始化也将通过调用它们的默认构造函数来默认初始化非静态非POD成员变量。但我不确定这到底是怎么发生的。这里是我的意思的一个例子:
#include <iostream>
#include <vector>
using namespace std;
class Test2 {
public:
Test2() {cout <<"Here";}
};
class Test {
public:
Test() {}
Test2 i;
};
int main() {
Test foo
假设我有一个名为Person的类:
class Person{
private int num = 1;
}
当调用Person类的空构造函数时,Java是否会首先将num初始化为默认值0,然后将num赋给1?或者Java会立即将num初始化为1?除非您使用初始化器语法,否则C++不会执行前者吗?
谢谢!
此代码使用MSVC编译,而不是使用GCC或Clang编译。
auto a = int{};
auto ua = unsigned int {};
请参阅
我强烈怀疑这可能是合法的C++,但古老的"C样式/类型和空格“之间的混合,以及在C++中进行初始化的50种不同方式,使得这对编译器来说是一项非常困难的工作。
在似乎是有意的设计决策中,C++对于对象和引用没有空值。这使得使用对象和引用非常优雅,因为我们不需要执行空检查。它还意味着构造函数必须始终返回一个对象:
void main () {
// o is guaranteed to be non-null by c++:
Object o = new Object();
}
// Allowing this hypothetical "failing" constructor would break the guarantee:
Object() { return void }
有时对象创建必须失
令我惊讶的是,我了解到这样的代码实际上是有效的:
class A {
B b;
C c = this->b.GetC();
}
我想我已经习惯于认为this本质上类似于Python中的self。但是,对于我来说,在类级别上,我们声明一个模板,类的每个实例都要对其进行复制,而在“声明”级别,this还不应该存在,这一点也是有意义的。但是,C++总是会感到惊讶,上面的代码似乎很管用。
话虽如此,这种风格不好吗?上面的代码和简单地在A的构造函数中初始化A之间到底有什么区别?
class A {
B b;
C c;
A() {
c = t
我有一个从基类继承的类,它提供了一个空的受保护的构造函数。
是否需要在派生类中实现空白构造函数(和析构函数),还是编译器将为我生成适当的构造函数。我正在使用C++ 11。
虽然这些问题的一些方面在这篇文章()中得到了解答,但我最感兴趣的是类派生时的行为。
所以我有这样的东西:
template<typename EnumClass>
class IVCounter
{
protected:
//!
//! \brief Ensure that this base class is never instantiated
//! directly.
//
我想知道这个代码是否合法(当然是在C++17中):
template<typename T = int>
class C {};
int main() {
C c;
}
这在GCC 8.1.0中编译得很好,但Clang 6.0.0却失败了。我试图在“标准”中找到答案,但我不是语言律师,我也想不出答案。另一方面,声明如下:
std::less l; // same as std::less<void> l;
那么,是否可以定义一个对象,其类型是一个模板类,其中所有模板参数都有默认值,而不使用角括号。
编辑
我试图澄清我的疑问:我的代码,只
我有以下课程:
class ArithmeticExpression
{
public:
ArithmeticExpression(std::string expr);
}
class Command
{
public:
Command(){};
//this is a virtual class
}
class CommandAssign : public Command
{
private:
ArithmeticExpression expr;
public:
CommandAssign();
CommandAssign(Arithm
我正在读J. P. Mueller和J. Cogswell的“Dummies全集”(C++ All-in-One for Dummies),无意中发现了这一点:
#include <iostream>
using namespace std;
int main()
{
int ExpensiveComputer;
int CheapComputer;
int *ptrToComp;
...
这段代码首先初始化所涉及的所有优点--两个整数和一个指向整数的指针。
只是想确认一下,这是个错误,应该写成“.通过声明‘,对吧?对我来说奇怪的是,这些基本的错误仍
如何在C++中定义类的非静态常量数据成员?如果我尝试编译以下代码:
class a
{
public:
void print()
{
cout<<y<<endl;
}
private:
const int y=2;
};
int main()
{
a obj;
obj.print();
}
我得到一个错误
ISO C++ forbids initialization of member ‘y’
我目前正在编写由Stroustrup编写的第六章《使用C++的原理和实践》中的一个计算器程序,我偶然发现了这句话,书中没有对此进行解释,而且我在网上找不到任何参考资料(更像是我不知道要搜索什么)。
Token(char ch) // make a Token from a char
:kind(ch), value(0) { }
Token(char ch, double val) // make a Token from a char and a double
:kind(ch), value(val) { }
如果你对此有任何解释我将不胜感激。