new 一个对象的时候加括号和不加括号有什么区别?

ceasar1134 2009-11-11 11:43:50
看一些代码在new对象的时候都加上(),可是我的习惯是都不加(),不知道这个到底是什么区别?有人说new对象的时候应该加上(),否则编译出错,但是我的程序编译器并没有报错!
比如:
CBase *base = new CDerived();
CBase *base = new CDeviced;


...全文
3693 30 打赏 收藏 转发到动态 举报
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
iCosim 2012-09-03
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 的回复:]

调用构造函数不同
[/Quote]

空的括号,只要编得过,都是调默认构造函数,有什么不同的啊
cdsnghw 2012-04-07
  • 打赏
  • 举报
回复
更正
A a();//在各种情况下,都表示声明一个不带参数的返回A对象的函数。
cdsnghw 2012-04-07
  • 打赏
  • 举报
回复
一般来说,new不会造成误解,容易误解的是不带参数的构造函数直接调用。
比如
A a();
//如果没有带参数的构造函数,表示声明一个返回A对象的函数,因此什么作用都没有;
//如果存在多于1个重载构造函数可以这么调用,则编译提示二义性错误;
//如果有带参数的构造函数,但是不能这么调用,则提示找不到对应构造函数。

A a;//则表示使用不带参数的构造函数,或者有默认参数值的构造函数。



cdsnghw 2012-04-07
  • 打赏
  • 举报
回复
wing++ 编译器试验了一下:

class C1{
C1(int a=3){}
};
//以下调用均通过,而且调试默认参数值都是3.
C1 *x1=new C1;
C1 *x2=new C1();

mltong 2010-09-21
  • 打赏
  • 举报
回复
我的VC6都是不确定的值
[Quote=引用 18 楼 steedhorse 的回复:]

对于自定义类型,调用的都是默认构造函数,没区别的。
只不过对于内建类型不太一样,加了扩号会做默认值初值化,比如:
int* p = new int;//p指向的int值是不确定的;
int* q = new int();//q指向的int值为0。
[/Quote]
kissnono8 2009-11-20
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 jackyjkchen 的回复:]
加括号调用没有参数的构造函数,不加括号调用默认构造函数或唯一的构造函数,看需求

[/Quote]

乱说,不加括号也只表示无参构造函数,假如我只构造一个带两参数的构造函数(是唯一的吧)编译照样通不过
#include <stdio.h>

class CDerived
{
public:
CDerived(int i);
};




void main()
{
CDerived *base = new CDerived();
}
long2015 2009-11-12
  • 打赏
  • 举报
回复
初学者,学习了
晨星 2009-11-12
  • 打赏
  • 举报
回复
唉,只是想举个例子让你打消那种念头,你反而沿着那条路越想越没谱了。
没有的事。
cphj 2009-11-11
  • 打赏
  • 举报
回复
如果是空括号,都是调用缺省构造器,加不加效果一样
cattycat 2009-11-11
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 jackyjkchen 的回复:]
加括号调用没有参数的构造函数,不加括号调用默认构造函数或唯一的构造函数,看需求

[/Quote]

可以结贴了。
bowfnfje 2009-11-11
  • 打赏
  • 举报
回复
编译报不报错,要看编译器了!
danxuezx 2009-11-11
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 jackyjkchen 的回复:]
加括号调用没有参数的构造函数,不加括号调用默认构造函数或唯一的构造函数,看需求

[/Quote]
原来如此
kouwenlong 2009-11-11
  • 打赏
  • 举报
回复
一般是不加的。
CDerived();这样代表一个构造函数,CDerived这样代表一个对象。

yet_flash 2009-11-11
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 jackyjkchen 的回复:]
加括号调用没有参数的构造函数,不加括号调用默认构造函数或唯一的构造函数,看需求
[/Quote]
顶~~~
pingpo 2009-11-11
  • 打赏
  • 举报
回复
学习楼上的。
:)
jackyjkchen 2009-11-11
  • 打赏
  • 举报
回复
加括号调用没有参数的构造函数,不加括号调用默认构造函数或唯一的构造函数,看需求
ceasar1134 2009-11-11
  • 打赏
  • 举报
回复
可不可以这么理解:
new AClass() 和 new AClass;
在这种情况下会可能调用一下2种构造函数,也就是steedhorse说的三种,将(每个参数都没有默认值,每个参数的类型也都没有默认构造函数)归结为一种:

class AClass
{
public:
AClass(); //1、没有参数的构造函数
AClass(BClass b, int i=5); //2、带有参数的构造函数,但是参数有初始化(默认值或者类
// 的构造函数)
};

晨星 2009-11-11
  • 打赏
  • 举报
回复
对于自定义类型来说,加不加扩号效果是一样的。
不会调用“唯一构造函数”。那样也不合理,比如说,假如“唯一构造函数”有一大堆参数,而且每个参数都没有默认值,每个参数的类型也都没有默认构造函数,此时,如果编译器偷偷调用了这个构造函数,且毫无根据地强行给各个参数赋予某个特定的值,岂不是过于彪悍了?
ceasar1134 2009-11-11
  • 打赏
  • 举报
回复
谢谢18楼,你的说法和我测试的一样。
可能是我对上面说的概念没有弄清楚吧
ceasar1134 2009-11-11
  • 打赏
  • 举报
回复
好像不行呀,CBase ×base = new CDerived(1);才可以
请解我解释一下你们说的这三个概念:默认构造函数,不带参数的构造函数,和唯一构造函数?
加载更多回复(10)

64,282

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧