标签: default-constructor

这个C++成员初始化行为是否定义良好?

假设我们有一个类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

21
推荐指数
1
解决办法
1680
查看次数

C++ 11私有默认构造函数

以下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;吗?

c++ gcc default-constructor c++11 gcc4.8

20
推荐指数
1
解决办法
2044
查看次数

使用默认构造函数初始化数组

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)

但这并不符合我的想法.这似乎是默认构造函数没有被调用.如何在创建数组时调用默认构造函数?

我也想知道上面的陈述是做什么的?

c# arrays array-initialize default-constructor

19
推荐指数
3
解决办法
4万
查看次数

结构初始化和默认参数的不直观行为

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()情况下没有调用构造函数,那么为什么要让它编译?

.net c# struct default-constructor default-arguments

18
推荐指数
1
解决办法
872
查看次数

Java中的无参数构造函数和默认构造函数之间的区别

实际上我无法理解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对象时调用此类的默认构造函数?

java constructor default-constructor

18
推荐指数
3
解决办法
5万
查看次数

为什么C++中的lambda永远不会是DefaultConstructible

我有没有抓住任何东西的lambdas,比如

[](){};
Run Code Online (Sandbox Code Playgroud)

我有一个模板类,包含这样一个lambda.由于lambda不包含非静态数据成员,也不包含虚函数,因此它应该是一个空类和DefaultConstructible.它只是一种可用于模板元编程的策略类.我想知道,为什么这样的类不是C++标准的默认构造.

旁注: 了解Lambda闭包类型如何删除默认构造函数是一个不同的问题,尽管标题看起来非常相似.它询问如何在没有可用的默认构造函数的情况下创建无状态lambda对象.我问为什么没有可用的默认构造函数.

c++ lambda default-constructor c++11

18
推荐指数
1
解决办法
856
查看次数

为什么移动构造函数需要其成员的默认构造函数?

我试图为没有复制构造函数的类实现移动构造函数.我收到一个错误,该类的成员的默认构造函数丢失.

这是一个简单的例子来说明这一点:

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++ default-constructor move-constructor

18
推荐指数
3
解决办法
1437
查看次数

C++中的显式默认构造函数17

在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之前和很久以前的事情,所以事情可能已经改变了.这个问题是最新的,但是答案似乎表明,无论是否存在默认构造函数,都会执行聚合初始化,因此我对最新标准中此更改的原因感到好奇.)

c++ explicit-constructor default-constructor c++17

18
推荐指数
1
解决办法
1354
查看次数

=声明与定义中的默认值

我知道这不是写作:

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)

我听到的原因是:

  1. 它避免了构造函数变成了deleted.如果无法定义函数,编译器将给出错误.

  2. noexcept即使某些成员字段的移动构造函数未注释,也会声明移动构造函数noexcept.

有人可以解释一下这些差异背后的理论吗?

c++ default-constructor noexcept

18
推荐指数
2
解决办法
553
查看次数

为什么无参数的Guid构造函数会生成一个空的GUID?

为什么无参数的Guid构造函数生成一个空的GUID而不是像Guid.NewGuid()一样默认生成的GUID?

空Guid有特殊用途吗?

.net c# guid default-constructor

17
推荐指数
1
解决办法
5625
查看次数