当我在无处调用函数时调用了奇怪的构造函数

时间:2014-04-07 06:14:50

标签: c++ constructor

你解释这是什么情况吗?

带参数的构造函数调用当我调用foo(3)函数时,它在Test类中不存在。

#include <iostream>

using namespace std;

namespace MyNameSpace{
    class Test{

    public:
    Test(int a){
        cout << "Test constructor with parameter has called" << endl;
    }
    };
    }

int main() {

    MyNameSpace::Test foo(3);

    return 0;
}

结果是

Test constructor with parameter has called

提前致谢!

4 个答案:

答案 0 :(得分:3)

您只是通过调用其构造函数MyNameSpace::Test来定义名为foo的{​​{1}}实例。这称为直接初始化

MyNameSpace::Test(int)

输出是预期的。

请注意,从C ++ 11开始,这种替代语法在这种特殊情况下具有相同的效果 1

MyNameSpace::Test foo(3); // direct initialization

此外,复制初始化在这种情况下具有相同的效果。从技术上讲,它对类型的要求比直接初始化 2

更多
MyNameSpace::Test foo{3}; // direct initialization, C++11

1但如果你的班级有一个构造函数采用MyNameSpace::Test foo = 3; // copy initialization ,那就不行了。使用大括号初始化时,该构造函数会受到青睐。

2该类型需要一个可访问的复制构造函数,尽管副本本身很可能被省略。

答案 1 :(得分:1)

foo不是函数,它是类的对象的名称。 当你这样做时:

Test foo(3); // you are creating an instance of your class

和参数化构造函数被称为

Test(int a){
        cout << "Test constructor with parameter has called" << endl;
    } // here is your parameterized constructor which takes int as argument

并在main中发送参数3,这是一个int,因此调用参数化构造函数。

答案 2 :(得分:0)

这个构造函数被称为:

Test(int a){
    cout << "Test constructor with parameter has called" << endl;
}

因为您正在构造一个MyNameSpace::Test类对象,其参数为3,作为传递给构造函数的整数。

MyNameSpace::Test foo(3);

这不是你想象的函数调用。即使对于函数声明它也是不正确的,无论如何函数调用都是这样的:

foo(3);

C ++ 11引入了统一的初始化语法,它应该让你更清楚,就像你写的那样:

MyNameSpace::Test foo{3};

答案 3 :(得分:0)

语法Test foo(3)是在堆栈上创建名为Test的{​​{1}}类型的对象的C ++方法,将参数foo传递给它的构造函数。< / p>