为什么编译器认为这是一个函数?

时间:2019-06-16 18:27:16

标签: c++ oop

使用构造函数初始化对象时,我很难区分这些差异。

我还读到Bjarne建议使用{}语法,但它基本上与()语法等效,因此我认为我理解该部分。

问题在第40行出现Car b();

#include <iostream>
#include <conio.h>

class Car
{
public:
    Car() // initialize car
    {
        std::cout << "Default constructor called" << std::endl;
        ++carNumber;
    }
    ~Car() // destroy car
    {
        --carNumber;
    }

    static int getCarNumber() { return carNumber; };

private:
    static int carNumber;
};
int Car::carNumber = 0;

int main() {

    // Equivalent
    std::cout << "Car a{};" << std::endl;
    Car a{};
    std::cout << "Car d = Car{};" << std::endl;
    Car d = Car{};

    // Equivalent
    std::cout << "Car e;" << std::endl;
    Car e;
    std::cout << "Car c = Car();" << std::endl;
    Car c = Car();


    std::cout << "Car b(); " << std::endl;
    Car b(); // this line

    std::cout << "CarNumber: " << Car::getCarNumber() << std::endl;
    _getch();
    return 0;
}

这是程序的输出:

Car a{};
Default constructor called
Car d = Car{};
Default constructor called
Car e;
Default constructor called
Car c = Car();
Default constructor called
Car b();
CarNumber: 4

我对“ Car b()”感到困惑。我认为编译器将其解释为返回Car的函数,但是如果是这种情况,我看不到该函数可以在哪里实现(应该导致错误?”。)

我希望“ Car b()”调用我创建的默认构造函数,但不会。

1 个答案:

答案 0 :(得分:0)

这显然是C ++的废话之一。语法是如此复杂,以至于编译器花了多年时间才同意什么是C ++,什么不是C ++,甚至在官方上都是模棱两可的。通过多多少少说的规则解决了歧义

  

如果某些东西含糊不清,并且可能是函数声明或对象定义,那么它就是函数声明

返回Car,不带参数且命名为b的函数的声明将是

Car b();

这就是编译器得到的。

这个荒谬的规则是C ++ "most vexing parse“陷阱的核心。

为什么要在代码块中声明一个函数?没有人知道...但是你可以。