我对c ++很新,我现在正在努力学习所有的基础知识, 我知道什么时候调用默认构造函数,但是当我尝试不同的语法时,它不会像我期望的那样工作。
请查看以下代码:
class a;
class b();
class c(NULL);
'class'是我用默认构造函数创建的类, 对于a和c,一切都运行良好,但对于b,它只是不会将变量识别为类成员。
我认为b和c基本相同,有什么不对? 谢谢!
答案 0 :(得分:3)
不要为您的班级命名" class
",因为它是保留名称。
对于C ++,如果构造函数不带参数,则使用
实例化它Foo a; // note, if you are using c++11, you can do Foo a{};
相反:
Foo b();
实际上做了一件完全出乎意料的事情*,并声明了一个名为b
的函数,它返回一个Foo
实例。
对于Foo c(null)
,它不会编译,因为没有默认构造函数接受参数。
*它被称为"最令人烦恼的解析" ,虽然我觉得这是夸大其词。它肯定会让你感到惊讶,但只要知道你可以在一个函数内声明一个函数原型,就应该足以删除"烦恼的"方面。
换句话说,int getMyInt();
显然是放在任何函数定义之外的函数原型。但是,由于这是同样在函数定义中的情况,int getMyInt();
没有做任何事情,它通常不会做......这是定义一个函数原型getMyInt
返回一个整数。
答案 1 :(得分:2)
b
被解释为函数的声明,不带参数并返回class
类型的对象。
这称为most vexing parse。 编辑:这是 不 最令人烦恼的解析。
答案 2 :(得分:-4)
你的意思是这样的吗?你知道,NULL代表0。 void意味着没有数据。
class Cl_Test
{
private:
int m_a;
public:
Cl_Test(int in_a= -1) { m_a= in_a; }
};
int main(int argc, char** argv) {
Cl_Test a;
Cl_Test b();
Cl_Test c(void);
return 0; }
编辑:
我的错误: