假设我们有一个类B,有一个member是默认初始化42.这个类知道如何打印它的值member.(它在c'tor中这样做):
struct B
{
B() : member(42) { printMember(); }
void printMember() const { std::cout << "value: " << member << std::endl; }
int member;
};
Run Code Online (Sandbox Code Playgroud)
然后我们添加一个A接收a的const引用的类,B并要求B打印它的值:
struct A
{
A(const B& b) { b.printMember(); }
};
Run Code Online (Sandbox Code Playgroud)
最后,我们添加另一个Aggregate聚合a A和a的类B.棘手的部分是a类型的对象A在对象b类型之前声明B,但是然后a使用(尚未生效的?)引用初始化b:
struct Aggregate
{
A a;
B b;
Aggregate() : a(b) …Run Code Online (Sandbox Code Playgroud) c++ constructor initialization default-constructor undefined-behavior
以下C++ 11代码在我的GCC 4.8上成功编译:
struct NonStack
{
private:
NonStack() = default;
public:
static NonStack* Create(){
return new NonStack;
}
};
NonStack a;
int main() { }
Run Code Online (Sandbox Code Playgroud)
但是,以下给出了编译错误:
struct NonStack
{
private:
NonStack(){}
};
NonStack a;
int main() { }
Run Code Online (Sandbox Code Playgroud)
为什么第一个成功?私有默认构造函数不应该通过禁止创建对象NonStack a;吗?
public class Sample
{
static int count = 0;
public int abc;
public Sample()
{
abc = ++Sample.count;
}
}
Run Code Online (Sandbox Code Playgroud)
我想创建一个上面的类数组,并希望通过调用默认构造函数来初始化数组中的每个元素,以便每个元素可以有不同的abc.所以我这样做:
Sample[] samples = new Sample[100];
Run Code Online (Sandbox Code Playgroud)
但这并不符合我的想法.这似乎是默认构造函数没有被调用.如何在创建数组时调用默认构造函数?
我也想知道上面的陈述是做什么的?
public struct Test
{
public double Val;
public Test(double val = double.NaN) { Val = val; }
public bool IsValid { get { return !double.IsNaN(Val); } }
}
Test myTest = new Test();
bool valid = myTest.IsValid;
Run Code Online (Sandbox Code Playgroud)
上面给出了valid==true因为没有调用默认arg的构造函数,并且使用标准默认值val = 0.0创建了对象.
如果结构是一个类,那么行为就是valid==false我所期望的.
我发现这种行为上的差异,特别是结构案例中的行为令人惊讶和不直观 - 发生了什么?stuct构造的默认arg服务是什么? 如果它无用为什么要让这个编译?
更新:澄清这里的重点不在于行为是什么 - 而是为什么在没有警告的情况下进行编译并且行为不直观.即如果没有应用默认的arg,因为在新的Test()情况下没有调用构造函数,那么为什么要让它编译?
实际上我无法理解no-arg构造函数和默认构造函数之间的区别.
import javax.swing.*;
public class Test extends JFrame {
public Test() {
super();
this.setSize(200,200);
this.setVisible(true);
}
public static void main(Sting[] arg) {
Test cFrame = new Test();
}
}
Run Code Online (Sandbox Code Playgroud)
这是否在创建名为cFrame的Test对象时调用此类的默认构造函数?
我有没有抓住任何东西的lambdas,比如
[](){};
Run Code Online (Sandbox Code Playgroud)
我有一个模板类,包含这样一个lambda.由于lambda不包含非静态数据成员,也不包含虚函数,因此它应该是一个空类和DefaultConstructible.它只是一种可用于模板元编程的策略类.我想知道,为什么这样的类不是C++标准的默认构造.
旁注: 了解Lambda闭包类型如何删除默认构造函数是一个不同的问题,尽管标题看起来非常相似.它询问如何在没有可用的默认构造函数的情况下创建无状态lambda对象.我问为什么没有可用的默认构造函数.
我试图为没有复制构造函数的类实现移动构造函数.我收到一个错误,该类的成员的默认构造函数丢失.
这是一个简单的例子来说明这一点:
struct A {
public:
A() = delete;
A(A const&) = delete;
A(A &&a) {}
};
struct B {
A a;
B() = delete;
B(B const&) = delete;
B(B &&b) {}
};
Run Code Online (Sandbox Code Playgroud)
试着编译这个,我得到:
move_without_default.cc: In constructor ‘B::B(B&&)’:
move_without_default.cc:15:11: error: use of deleted function ‘A::A()’
B(B &&b) {}
^
move_without_default.cc:6:2: note: declared here
A() = delete;
^
Run Code Online (Sandbox Code Playgroud)
为什么这是一个错误?有什么办法吗?
在C++ 17中,标准库中的空标记类型现在具有标记的默认构造函数explicit,并且也是= default.例如,std::piecewise_construct_t现在定义为
struct piecewise_construct_t { explicit piecewise_construct_t() = default; };
Run Code Online (Sandbox Code Playgroud)
我的问题很简单,这是C++ 14改变的原因是什么?明确默认的显式默认构造函数(!)对空类的意义是什么?
(为了避免被标记为欺骗:2010年的这个问题询问了显式默认构造函数的用途,但那是在C++ 11之前和很久以前的事情,所以事情可能已经改变了.这个问题是最新的,但是答案似乎表明,无论是否存在默认构造函数,都会执行聚合初始化,因此我对最新标准中此更改的原因感到好奇.)
我知道这不是写作:
class A {
public:
A(A&&) noexcept = default;
}?
Run Code Online (Sandbox Code Playgroud)
一个人应该写得更好
class A {
public:
A(A&&) noexcept;
}?
inline A::A(A&&) noexcept = default;
Run Code Online (Sandbox Code Playgroud)
我听到的原因是:
它避免了构造函数变成了deleted.如果无法定义函数,编译器将给出错误.
noexcept即使某些成员字段的移动构造函数未注释,也会声明移动构造函数noexcept.
有人可以解释一下这些差异背后的理论吗?
为什么无参数的Guid构造函数生成一个空的GUID而不是像Guid.NewGuid()一样默认生成的GUID?
空Guid有特殊用途吗?