问题:如下两条语句的区别是什么?
Student a;
Student b();
假设有一个Student类:
class Student
{
private:
int age;
public:
// 不带参数的构造函数
Student()
{
this->age = 7;
}
// 带一个参数的构造函数
Student(int age)
{
this->age = age;
}
}
主函数main中创建Student对象如下:
int main()
{
Student a; // 创建一个对象a,且会调用无参构造函数。
Student b(); // 似乎应该也是创建一个对象,且调用无参构造函数,但实际却不然,且看后面分解。
Student c(10);// 创建一个对象c,且会调用带一个参数的构造函数。
}
其中“Student b();”看起来像是创建一个对象b,但实际却不是。先看下面的例子。
假如在另一个文件当中定义了下面一个函数:
Student createStudent()
{
Student *p = new Student();
return *p;
}
现在想在main函数当中使用上面这个函数,而main函数与上面函数的定义不在同一个文件当中,因此在main函数中需要先声明该函数,然后再使用:
int main()
{
Student createStudent(); // 声明函数
Student tom = createStudent();// 运行该函数
}
现在问题就出现了,该声明函数的形式和上面提到的创建b对象的形式一样:
Student createStudent();
Student b();
这样就产生了冲突,这个语句到底是在声明函数呢还是在创建对象呢?答案是它是在声明函数,而想要调用不带参数的构造函数来创建对象则需要使用如下形式:
Student b;
另外,如果要声明带一个参数的函数,那么它是否会和使用带一个参数的构造函数创建对象时冲突呢?答案是不会。请看如下例子:
现将createStuent()函数增加一个age参数:
Student createStudent(int age)
{
Student *p = new Student(age);
return *p;
}
现在声明、运行该函数将变成如下形式:
int main()
{
Student createStudent(int); // 声明函数
Student tom = createStudent(7);// 运行该函数
}
可以看到,声明该函数与调用带一个参数的构造函数来创建对象并不冲突:
Student createStudent(int); // 声明函数
Student c(10); // 创建一个对象c
声明函数时,括号当中是数据类型“int”,而创建对象时括号当中是具体的值“10”。