1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > 关于创建对象时带括号与不带括号的区别(无参构造函数的调用)

关于创建对象时带括号与不带括号的区别(无参构造函数的调用)

时间:2023-03-02 14:48:57

相关推荐

关于创建对象时带括号与不带括号的区别(无参构造函数的调用)

在复习中遇到的问题:

关于创建对象时带括号与不带括号的区别

亲自实验后,发现并不相同!而以前我没有亲自上机实验就错误的认为“两者相同,都会调用默认构造函数”。其实不然!

我在网上找了好一会,发现网上讲的好高深,但是看完还是好模糊,应该都是复制一个人的。

我翻书查找相关知识,发现《C++面向对象程序涉及第2版》居然有一模一样的问题和解答。看来教科书还是要好好重视的。

首先说明:(摘自上书)

(1)在建立对象时不必给出实参的构造函数,称为默认构造函数。显然无参构造函数属于默认构造函数。一个类只能有一个默认构造函数。

(2)如果在建立对象时选用的是无参构造函数,应该注意书写定义对象的语句。

如有如下的定义对象语句:

Box box1; //正确语句

注意不要写成:

Box box1();//错误

上面的语句并不是定义Box类的对象box1,而是声明一个普通函数box1,此函数的返回值为Box类型

因为构造函数是不能被用户显式调用的。

下面请看实验&结果:

实验代码(不带括号,调用默认构造函数):

#include <iostream>using namespace std;class A{public:A(){cout << "调用A的构造函数" << endl;}~A(){cout << "删除A对象 " << endl;}int name;};int main() {A p;cout<<p.name<<endl;return 0;}

代码正确运行,结果为:

实验代码(带括号,声明一个空的函数):

#include <iostream>using namespace std;class A{public:A(){cout << "调用A的构造函数" << endl;}~A(){cout << "删除A对象 " << endl;}int name;};int main() {A p();//cout<<p.name<<endl;return 0;}

实验结果:什么都没做。

为什么那一行代码要注释掉才能运行?

这也恰恰说明了声明的是一个函数而不是定义一个对象,没有调用默认的无参构造函数。故P是一个函数而不是类A的一个对象,当然不能用“p.name”!

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