当我无处调用一个函数时调用了奇怪的构造函数
Weird constructor called when I called a function in nowhere
你解释一下这是什么情况吗?
带参数的构造函数调用了 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)
来定义一个名为 foo
的MyNameSpace::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)
是在堆栈上创建名称为 foo
的 Test
类型的对象,并将参数3
传递给其构造函数的C++方法。
相关文章:
- 如何用参数值调用函数(仅在运行时已知)
- 从python中调用C++函数并获取返回值
- 当使用通配符和null指针调用函数时,对输出的说明
- 从R调用C++函数并对其进行集成时出错
- 使用QTreeView,如何通过调用函数只突出显示特定的行/列
- 如何在qt中从另一个类调用函数
- 在 COUT 语句中使用 COUT 调用函数
- 如何从线程中的不同模块调用函数?
- C++从函数指针数组调用函数
- 当 A 在 for 循环中调用函数 B 时,如何计算函数 A 的空间复杂度?
- 如何在 C/C++ 中从外部库调用函数
- 如何使用运算符在同一行中多次调用函数
- 是否可以创建一个从不同类调用函数的线程?
- 无法为类成员调用函数
- 如何从另一个标头 c++ 调用函数
- C++有什么方法可以在既不调用函数模板也不提供其模板参数的情况下引用函数模板?
- 如何只允许在调用函数 B 后调用函数 A?
- 我可以这样调用函数吗?
- 如何在 c++ 的类中递归调用函数方法?
- 为什么在指向对象的迭代器上调用函数不允许我更改对象本身?