C++奇怪的构造函数行为

use*_*771 5 c++ stack constructor destructor

任何人都可以向我解释一下Complex a之间的区别; 复合b();

#include<iostream>

class Complex
{
public:

    Complex()
    {
        std::cout << "Complex Constructor 1" << std::endl;
    }

    Complex(float re, float im)
    {
        std::cout << "Complex Constructor 2" << std::endl;
    }

    ~Complex()
    {
        std::cout << "Complex Destructor" << std::endl;
    }    
};

int main()
{
    Complex a;
    std::cout << "--------------------------" << std::endl;
    Complex b();
    std::cout << "--------------------------" << std::endl;
    Complex c(0,0);
    std::cout << "--------------------------" << std::endl;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

Complex Constructor 1
--------------------------
--------------------------
Complex Constructor 2
--------------------------
Complex Destructor
Complex Destructor
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,复杂的a; 确实调用它的默认构造函数Complex b(); 不和复合c(0,0); 调用重载的构造函数.

这里发生了什么?我想,那复杂的b(); 会创建一个堆栈变量并调用它的默认构造函数来初始化它吗?

Pio*_*ycz 8

Complex b();是功能声明.这是没有参数和返回Complex对象的函数.

这是一个非常常见的错误并且有自己的名字:最令人烦恼的解析

C++ 11通过引入统一初始化语法来帮助解决这个问题

Complex b{};
Run Code Online (Sandbox Code Playgroud)

  • 我认为这只是一个普通的令人烦恼的解析.最令人烦恼的是更令人烦恼. (2认同)