1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > 调用无参构造函数创建对象与函数声明

调用无参构造函数创建对象与函数声明

时间:2021-01-05 09:20:41

相关推荐

调用无参构造函数创建对象与函数声明

问题:如下两条语句的区别是什么?

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”。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。