考虑以下代码:
example_t* a = new example_t[8];
Run Code Online (Sandbox Code Playgroud)
class example_t有默认的ctor可以抛出,假设数组中第5个元素的构造抛出.是否有自动调用4个第一个元素的析构函数?这是一个定义明确的行为吗?
我的问题源于Scott Meyers 研究Effective C++.在该书的第二项中,写下如下:
要将常量的范围限制为类,必须使其成为成员,并且为了确保最多只有一个常量副本,必须使其成为静态成员.
这是正确的写.然后立即给出以下示例:
class GamePlayer {
private:
static const int NumTurns = 5;
int scores[NumTurns];
....
};
Run Code Online (Sandbox Code Playgroud)
然后写下以下示例:
你在上面看到的是一个声明,而不是NumTurns的定义.
我的第一个问题是:这个陈述的含义是什么?
紧接着提到以下内容:
通常C++要求您为所使用的任何内容提供定义,但是静态和整数类型的类特定常量(例如 - 整数,字符,bools)是一个例外.只要您不接受他们的地址,您就可以声明它们并在不提供定义的情况下使用它们.如果您确实将类的地址设为常量,或者即使您没有使用该地址,您的编译器也错误地坚持定义,您提供了一个单独的定义,如下所示:
const int GamePlayer::Numturns; //definition of NumTurns
为什么现在它是一个定义而不是声明?
我理解函数上下文中的差异,但在常规变量的上下文中不理解它.此外,有人可以扩展作者的意思
...如果你确实把一个类的地址定为常数,或者如果你的......部分引用了上面引用的段落?
PS:我是C++的新手.
是否有可能在c ++中枚举枚举.我必须有类似的东西:
错误类型:
类型1:
类型2:
类型3:
这些中的每一个都是整数值.它们应该用在通信协议栈中.在接收端,接收器必须从接收的值中解码错误的类型和原因.如果不能使用枚举,最好的方法是什么?
MSDN文章如何:编写移动构造函数具有以下建议.
如果为类提供移动构造函数和移动赋值运算符,则可以通过编写移动构造函数来调用移动赋值运算符来消除冗余代码.以下示例显示了调用移动赋值运算符的移动构造函数的修订版本:
// Move constructor.
MemoryBlock(MemoryBlock&& other)
: _data(NULL)
, _length(0)
{
*this = std::move(other);
}
Run Code Online (Sandbox Code Playgroud)
这个代码是通过双重初始化MemoryBlock的值来实现低效的,还是编译器能够优化掉额外的初始化?我是否应该通过调用移动赋值运算符来编写移动构造函数?
我想知道为什么仿algorithm函数通过副本传递给函数:
template <typename T> struct summatory
{
summatory() : result(T()) {}
void operator()(const T& value)
{ result += value; std::cout << value << "; ";};
T result;
};
std::array<int, 10> a {{ 1, 1, 2, 3, 5, 8, 13, 21, 34, 55 }};
summatory<int> sum;
std::cout << "\nThe summation of: ";
std::for_each(a.begin(), a.end(), sum);
std::cout << "is: " << sum.result;
Run Code Online (Sandbox Code Playgroud)
我期待以下输出:
总和:1; 1; 2; 3; 5; 8; 13; 21; 34; 55; 是:143
但是sum.result包含0,这是在ctor中分配的默认值.实现所需行为的唯一方法是捕获以下内容的返回值for_each …
Visual Studio中的Incremental Search(Ctrl + I)和Quick Find(Ctrl + F)有什么区别?
我看过一个视频,其中Crockford告诉我们不要使用new关键字.如果我没弄错的话,他说要使用Object.create.new他写道:http://javascript.crockford.com/prototypal.html他为什么告诉我们不要使用它是否已经用它来实现原型继承?
我希望他使用Object.create而不是new像这样:
function object(o) {
return Object.create((function() {}).prototype = o);
}
Run Code Online (Sandbox Code Playgroud)
那为什么他仍然使用new?
我想知道关于班级大小的详细描述.我想知道是否只有数据成员和成员函数没有任何虚拟关键字,那么为什么类大小只依赖于数据成员.对于例如:
class A {
int a;
public:
int display() {
cout << "A=" << a << endl;
}
};
Run Code Online (Sandbox Code Playgroud)
当我检查sizeof(A)我发现它是4字节.为什么会这样?为什么成员函数对A类的大小没有影响?
谢谢
我有以下示例,我已经从中分解§14.7.3/6 [temp.expl.spec]了在主模板中定义类成员枚举,然后专门化它.以下内容不能在clang中编译:
template<class T>
struct A {
enum E : T;
};
template<class T>
enum A<T>::E : T { eT };
template<>
enum A<char>::E : char { echar }; // ill-formed, A<char>::E was instantiated
// when A<char> was instantiated
// error: explicit specialization of 'E' after instantiation
Run Code Online (Sandbox Code Playgroud)
原因应该是在专门化之前实例化未编组成员枚举的定义.14.7.1 [temp.inst]/1:
类模板特化的隐式实例化导致隐式实例化未编组成员枚举和成员匿名联合的定义.
我试图理解为什么这是一个问题.是因为如果枚举已经有了定义,那么在专门化期间会导致重新定义错误吗?