C++ 实例化对象有括号和无括号的区别

环境: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 关键字来创建对象,使用带括号和不带括号是一样的。

上一篇:Android中获取WebView加载的html中console.log输出的内容


下一篇:JS实现最短路径之迪杰斯特拉(Dijkstra)算法