问题:如下两条语句的区别是什么?
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”。