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

在复习中遇到的问题:
关于创建对象时带括号与不带括号的区别
亲自实验后,发现并不相同!而以前我没有亲自上机实验就错误的认为“两者相同,都会调用默认构造函数”。其实不然!

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

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

首先说明:(摘自上书)
(1)在建立对象时不必给出实参的构造函数,称为默认构造函数。显然无参构造函数属于默认构造函数。一个类只能有一个默认构造函数。
(2)如果在建立对象时选用的是无参构造函数,应该注意书写定义对象的语句。

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

Box box1; //正确语句

注意不要写成:

Box box1();//错误

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

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

下面请看实验&结果:
实验代码(不带括号,调用默认构造函数):

#include 
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;
}

代码正确运行,结果为:
关于创建对象时带括号与不带括号的区别(无参构造函数的调用)_第1张图片
实验代码(带括号,声明一个空的函数):

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

int main() {
    A p();
    //cout<
    return 0;
}

实验结果:什么都没做。
在这里插入图片描述
为什么那一行代码要注释掉才能运行?
这也恰恰说明了声明的是一个函数而不是定义一个对象,没有调用默认的无参构造函数。故P是一个函数而不是类A的一个对象,当然不能用“p.name”!

你可能感兴趣的:(C/C++,c++,构造函数,创建对象)