在C ++中使用默认参数到构造函数的不同方法

时间:2014-03-09 08:17:56

标签: c++ constructor copy-constructor copy-assignment visual-studio-2012

以下三段代码与MSVC有什么区别?

代码1: Foo ctor定义为:

Foo::Foo(Bar &bar = Bar());

Foo ctor用作:

Foo foo = new Foo();

代码2: Foo ctor定义为:

Foo::Foo()
{
    Bar bar = Bar();
    Foo(bar);
}

Foo::Foo(Bar &bar);

Foo ctor用作:

Foo foo = new foo();

代码3: Foo ctor定义为:

Foo::Foo(Bar &bar);

Foo ctor用作:

Bar bar = Bar();
Foo foo = new foo(bar);

修改 对代码进行了更正。目的是解释这个想法,没有关注代码,所以犯了错误。对不起。

具体问题是弄清楚代码2和3之间的区别。由于某种原因,在代码2的情况下,Foo类ctor的消费者导致崩溃,而在代码3的情况下,它不会吨。我没有消费者的具体代码,所以无法自己解决。

1 个答案:

答案 0 :(得分:3)

在前两个中,您甚至没有调用构造函数,而是声明了一个函数:

Foo foo(); // function foo, returns a Foo object

要默认构建Foo,您需要

Foo foo;   // C++11 and C++03
Foo foo{}; // C++11

您的大多数代码都是非法的,或者它没有达到预期效果。例如,除了创建本地Bar变量bar之外,此构造函数不执行任何操作,并尝试创建具有相同名称的实例类型Foo

Foo::Foo()
{
    Bar bar = Bar(); // local variable bar
    Foo(bar);        // error: 'bar' has a previous declaration as 'Bar bar'
}