环境:VS2022
我们先定义一个 complex 类:
class complex
{
public:
complex(double r= 0,double i = 0):re(r),im(i)
{
std::cout << "re=" << re << "im=" << im << std:: endl;
}
private:
double re, im;
};
这里我们定义了一个带有默认参数的构造函数。接下来我们在 main 函数中实例化 complex 对象,不使用括号,并输出其类型
int main()
{
complex c1;
std::cout << typeid(c1).name() << std::endl;
}
看一下输出:
re=0im=0
class complex
我们可以看到第一行是构造函数的输出,第二行输出 c1 的类型为 complex。
接下来,我们使用带括号的语法来定义一个 complex 类型
complex c2();
看一下输出:
class complex __cdecl(void)
我们发现构造函数并没有调用,而且输出的 c2 类型是一个函数,所以如果实例化一个没有参数的构造函数的类(或者所有的参数都有默认参数),不需要使用括号,使用括号以后,编译器会认为你定义了一个没有参数,返回值为 complex 的函数,
接下来我们在堆上实例化一个 complex 对象
complex *pc1 = new complex;
complex *pc2 = new complex();
std::cout << typeid(pc1).name() << std::endl;
std::cout << typeid(pc2).name() << std::endl;
看一下输出:
re=0im=0
re=0im=0
class complex * __ptr64
class complex * __ptr64
前两行为构造函数输出,后两行显示 pc1 pc2 为 complex 类型的指针。
所以使用 new 关键字来创建对象,使用带括号和不带括号是一样的。