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

Weird constructor called when I called a function in nowhere

本文关键字:调用 函数 一个 构造函数      更新时间:2023-10-16

你解释一下这是什么情况吗?

带参数的构造函数调用了 When I 调用 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

提前感谢!

您只是通过调用其构造函数MyNameSpace::Test(int)来定义一个名为 fooMyNameSpace::Test实例。这称为直接初始化

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

输出是预期的。

请注意,自 C++11 起,此替代语法在此特定情况1 中将具有相同的效果:

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

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

MyNameSpace::Test foo = 3; // copy initialization

1 但是,如果您的类有一个构造函数std::initializer_list则不会。该构造函数在使用大括号初始化时受到青睐。

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

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,因此调用了您的参数化构造函数。

此构造函数称为:

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};
语法

Test foo(3)是在堆栈上创建名称为 fooTest 类型的对象,并将参数3传递给其构造函数的C++方法。