https://blog.csdn.net/a2796749/article/details/46908035

总结起来就是:
如果在使用new在堆上开辟某一类型的空间的时候

  • 如果是非自定义类型(int等),后面加括号的话,就以为了进行初始化,如果括号内有参数,就初始化为参数,如果没有参数(就是只有括号,什么都没有),就初始化为0

  • 如果是自定义类型(类、结构体),后面加了括号的话,说明调用构造函数(也是初始化)

    首先回顾一下关于构造函数的知识:

    构造函数是用来在对象创建的时候对对象进行初始化的

    用户可以自定义构造函数

    构造函数分为带参数的构造函数和不带参数的构造函数

    带参数的构造函数使得每次创建对象的时候可以根据不同的参数对于对象进行不同的初始化

    而众所周知,带参数的函数可以进行重载(函数可重名,通过参数的个数和类型进行区分,根据参数个数和类型调用对应的同名函数)所以一个类中可以有多个构造函数(构造函数都是重名的,没有类型,名称跟类名一样);也可以构造参数缺省的函数(默认参数的构造函数)

    一个类中可以有多个构造函数,其中不需要输入参数的函数称为默认构造函数

    ==默认构造函数一个类中只能有一个==

    显然,无参构造函数是默认构造函数,参数全具有默认参数的函数(全缺省函数)也是默认构造函数,所以两者不能共存

    而且有了全缺省的构造函数,就不能存在别的构造函数了(有全缺省构造函数的类不能重载构造函数)

    因为全缺省的构造函数覆盖了任何可能的参数情况,再存在别的构造函数的时候就会产生歧义

    无参:全缺省参数全都是用默认参数

    有部分参数:缺少的参数用默认参数,不缺少的用给定的参数

    含全部参数:全部都用给定的参数

    比如一个含有三个int类成员变量abc的类S,如果定义了一个全缺省构造函数S(int A=1,int B=1,int C=1)

    也定义了一个含两个参数的构造函数S(int A,int B),那么在定义对象S s(2,2)的时候,就会产生歧义,不知道应该调用哪个构造函数

    另外也要注意别的可能产生的歧义出现,比如如果定义的是S(int A,int B=1,int C=1)和S(int A,int B)

    那在定义对象定义对象S s(2,2)的时候,也会产生歧义

    如果用户没有自定义出默认构造函数,系统会用系统自己具有的默认构造函数(就叫系统默认构造函数吧)。系统默认构造函数的函数体是空的,不会进行任何操作,也就是说不会真正进行初始化,只是有这么个空函数而已。如果用户自定义了默认构造函数,系统就会用用户自定义的默认构造函数(有的资料称这是过程是系统合成构造函数,就是将用户自定义的构造函数设为默认构造函数)

    如果new的对象类型后面加括号的话,分为带参数和不带参数,如果类中用户自定义了带参数的构造函数,就可以在括号里带参数进行初始化;不带参数的话,如果用户自定义了默认构造函数,new创建出的对象就会调用默认构造函数进行初始化,如果用户没有自定义默认构造函数,系统就会调用系统默认构造函数对new出来的对象进行初始化。

    如果不加括号,用户自定义了默认构造函数,new创建对象的时候会调用自定义的默认构造函数;用户没有自定义默认构造函数,new创建的对象就不会初始化

    ==总结:==

    加括号一定会进行初始化;

    不加括号,自定义了默认构造函数会初始化,没有就不会初始化

new 对象加括号和不加括号的区别_丿咫尺天涯的博客-CSDN博客