我有这个示例代码:
#include <iostream>
class A
{
public:
A()
{
std::cout << "Default constructor of A" << '\n';
}
A(int i)
{
std::cout << "Inside the constructor of A with one int argument" << '\n';
}
};
class B : A
{
using A::A;
public:
B()
{
std::cout << "Default constructor of B" << '\n';
}
};
int main()
{
B b(12);
std::cout << "End of main";
}
Run Code Online (Sandbox Code Playgroud)
哪个输出:
Inside the constructor of A with one int argument
End of main …Run Code Online (Sandbox Code Playgroud) 隐式编译器创建的默认构造函数是否可以有多个 null 主体?根据IBM的网站,答案是:不。
我有这个项目有点难倒我:
这是声明一个名为 StackWalkerToConsole 的类的实例,没有定义默认构造函数的地方:
void func5()
{
StackWalkerToConsole sw;
...
}
Run Code Online (Sandbox Code Playgroud)
这会以某种方式导致其父类的用户定义构造函数之一被调用:
StackWalker::StackWalker(int options, LPCSTR szSymPath, DWORD dwProcessId, HANDLE hProcess)
{
// The function has a body, I just removed it for clarity's sake.
...
}
Run Code Online (Sandbox Code Playgroud)
因此,我在这个构造函数上放置了一个断点,并使用调用堆栈查看了 StackWalkerToConsole 的默认构造函数。由于源码中没有定义,所以只能看它的反汇编:
StackWalker_VC2017.exe!StackWalkerToConsole::StackWalkerToConsole(void):
0000000140008210 mov qword ptr [rsp+8],rcx
0000000140008215 push rdi
0000000140008216 sub rsp,40h
000000014000821A call qword ptr [__imp_GetCurrentProcess (014012E060h)]
0000000140008220 mov qword ptr [rsp+30h],rax
0000000140008225 call qword ptr [__imp_GetCurrentProcessId (014012E068h)]
000000014000822B mov rcx,qword ptr [rsp+30h]
0000000140008230 …Run Code Online (Sandbox Code Playgroud)