使用构造函数初始化对象时,我很难区分这些差异。
我还读到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()”调用我创建的默认构造函数,但不会。
答案 0 :(得分:0)
这显然是C ++的废话之一。语法是如此复杂,以至于编译器花了多年时间才同意什么是C ++,什么不是C ++,甚至在官方上都是模棱两可的。通过多多少少说的规则解决了歧义
如果某些东西含糊不清,并且可能是函数声明或对象定义,那么它就是函数声明
返回Car
,不带参数且命名为b
的函数的声明将是
Car b();
这就是编译器得到的。
这个荒谬的规则是C ++ "most vexing parse“陷阱的核心。
为什么要在代码块中声明一个函数?没有人知道...但是你可以。