new A()和new A 有什么区别?

方紫涵 2011-04-27 01:35:32
类A;


new A()和new A 有什么区别?
...全文
667 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
BT_Dana 2013-11-11
  • 打赏
  • 举报
回复
引用 7 楼 pathuang68 的回复:
[Quote=引用楼主 xwhbwas2008 的回复:] 类A; new A()和new A 有什么区别? [/Quote] 我觉得是有区别的。比如,如果在A中你定义了一个带参数的构造函数,那么new A就会出错,而用new A(参数)就OK。 比如:

#include<iostream>
using namespace std;

class A
{
public:
	A(int x)
	{
	}
};
int main()
{
	A *a = new A(1);
	A *b = new A;			// 通过不了编译
	return 0;
}
当然如果A中有不带参数的构造函数时,两者的写法效果是一样的。
引用 18 楼 xwhbwas2008 的回复:
[Quote=引用 7 楼 的回复:] 引用楼主 xwhbwas2008 的回复: 类A; new A()和new A 有什么区别? 我觉得是有区别的。比如,如果在A中你定义了一个带参数的构造函数,那么new A就会出错,而用new A(参数)就OK。 比如: C/C++ code #include<iostream> using namespace std; class A { public: …… [/Quote] 居士说的真好: no matching function for call to ‘A::A()’ 钱能的书302页说: 如果手工定义了无参的构造函数,或者其他任何构造函数,则系统不再提供默认的无参构造函数。 而 new A 就是调用无参的构造函数,所以出现错误no matching function for call to ‘A::A()’ 再就是回到本帖子主题:钱能的书300页: Date g; Date g(); 语法上讲:后者也是名叫g的返回临时对象的函数声明!因此c++在设计时,萎了区别无初始化的对象定义和返回类型对象的无参函数声明,也为了保持无初始化变量定义与无初始化(无参)对象定义的一致性,规定: Date g;无参对象定义 Date f();返回类对象的无参函数声明。
区别是有点, 但是这个例子不能作为反例 一个类显示定义了有参的构造函数, 那么无参的你不定义就没有 new A不对 new A()仍然不对 还是一样的
Atahui 2013-01-29
  • 打赏
  • 举报
回复
对于内置类型和没有默认构造函数的类型,采用不同初始化方式是有很大差别。 new A()和 new A 前者指向一个初始化的0。 后者指向一个未初始化的数。
方紫涵 2012-10-24
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

引用楼主 xwhbwas2008 的回复:
类A;


new A()和new A 有什么区别?


我觉得是有区别的。比如,如果在A中你定义了一个带参数的构造函数,那么new A就会出错,而用new A(参数)就OK。

比如:
C/C++ code

#include<iostream>
using namespace std;

class A
{
public:
……
[/Quote]

居士说的真好:
no matching function for call to ‘A::A()’

钱能的书302页说:
如果手工定义了无参的构造函数,或者其他任何构造函数,则系统不再提供默认的无参构造函数。
而 new A 就是调用无参的构造函数,所以出现错误no matching function for call to ‘A::A()’



再就是回到本帖子主题:钱能的书300页:
Date g; Date g();
语法上讲:后者也是名叫g的返回临时对象的函数声明!因此c++在设计时,萎了区别无初始化的对象定义和返回类型对象的无参函数声明,也为了保持无初始化变量定义与无初始化(无参)对象定义的一致性,规定:

Date g;无参对象定义
Date f();返回类对象的无参函数声明。



ww884203 2011-04-27
  • 打赏
  • 举报
回复
对程序来说没区别,对程序员来说有显式和隐式的区别
toadzw 2011-04-27
  • 打赏
  • 举报
回复
构造参数的问题,区别不大
曳尾之鱼 2011-04-27
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 dourgulf 的回复:]

引用 8 楼 newstudent_never 的回复:

引用 4 楼 luciferisnotsatan 的回复:
A obj;和A obj();
这个是有区别的,后者会被编译器当成一个函数声明(无参,返回类型为A)。


YES, ++

说的没错,但是和LZ的问题无关~~~
[/Quote]

子达如何 2011-04-27
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 newstudent_never 的回复:]

引用 4 楼 luciferisnotsatan 的回复:
A obj;和A obj();
这个是有区别的,后者会被编译器当成一个函数声明(无参,返回类型为A)。


YES, ++
[/Quote]
说的没错,但是和LZ的问题无关~~~
we_sky2008 2011-04-27
  • 打赏
  • 举报
回复
new A;和new A();可能是不同的!

5.3.4.15
A new-expression that creates an object of type T initializes that object as follows:
If the new-initializer is omitted:
if T is a (possibly cv-qualified) non-POD class type (or array thereof), the object is default-
initialized (8.5). If T is a const-qualified type, the underlying class type shall have a user-declared
default constructor.
— Otherwise, the object created has indeterminate value. I T is a const-qualified type, or a (possibly
cv-qualified) POD class type (or array thereof) containing (directly or indirectly) a member of
const-qualified type, the program is ill-formed;
— If the new-initializer is of the form (), the item is value-initialized (8.5);


8.5.5
To value-initialize an object of type T means:
if T is a class type (clause 9) with a user-declared constructor (12.1), then the default constructor for T is
called (and the initialization is ill-formed if T has no accessible default constructor);
if T is a non-union class type without a user-declared constructor, then every non-static data member
and base-class component of T is value-initialized;
taodm 2011-04-27
  • 打赏
  • 举报
回复
就没有人能勤快点去查查C++标准么,这个区别比较微妙比较小但是比较严重的。
sd5366434 2011-04-27
  • 打赏
  • 举报
回复
没有区别 new A() 等于显式的告诉电脑说 我要申请一块内存存放一个 A类型的数据 并且调用没有参数的构造函数,
jackzhhuang 2011-04-27
  • 打赏
  • 举报
回复
区别是:一个有括号,一个没括号,回答完毕
xmu_才盛 2011-04-27
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 luciferisnotsatan 的回复:]
A obj;和A obj();
这个是有区别的,后者会被编译器当成一个函数声明(无参,返回类型为A)。
[/Quote]

YES, ++
pathuang68 2011-04-27
  • 打赏
  • 举报
回复
[Quote=引用楼主 xwhbwas2008 的回复:]
类A;


new A()和new A 有什么区别?
[/Quote]

我觉得是有区别的。比如,如果在A中你定义了一个带参数的构造函数,那么new A就会出错,而用new A(参数)就OK。

比如:

#include<iostream>
using namespace std;

class A
{
public:
A(int x)
{
}
};
int main()
{
A *a = new A(1);
A *b = new A; // 通过不了编译
return 0;
}


当然如果A中有不带参数的构造函数时,两者的写法效果是一样的。
赵4老师 2011-04-27
  • 打赏
  • 举报
回复
可能唯一的区别就是多了()吧。
(^_^)
KID_coder 2011-04-27
  • 打赏
  • 举报
回复
没有区别~
new A() 明显点吧~ 调用默认构造函数~
java 里面就要加()
luciferisnotsatan 2011-04-27
  • 打赏
  • 举报
回复
A obj;和A obj();
这个是有区别的,后者会被编译器当成一个函数声明(无参,返回类型为A)。
luciferisnotsatan 2011-04-27
  • 打赏
  • 举报
回复
没有区别

都是用默认构造函数
方紫涵 2011-04-27
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 wulibin136 的回复:]

没有区别
[/Quote] 有没有个说法?
或者 来由?
淡蓝 2011-04-27
  • 打赏
  • 举报
回复
没有区别
课程简介: 课程总计41课时,从什么是事务讲起,直到分布式事务解决方案,很的0基础基础与提升系列课程。对于难以理解的知识点,全部用画图+实战的方式讲解。 第一部分:彻底明白事务的四个特性:原子性、一致性、隔离性、持久性,用场景和事例来讲解。 第二部分:实战讲数据库事务的6中并发异常:回滚丢失、覆盖丢失、脏读、幻读、不可重复读、MVCC精讲。 第三部分:彻底搞清楚4种事务隔离级别:READ_UNCOMMITTED 读未提交隔离级别、READ_COMMITTED 读已提交隔离级别、REPEATABLE_READ 可重复度隔离级别、SERIALIZABLE 序列化隔离级别 第四部分:彻底搞清楚MySQL的各种锁:行锁、表锁、共享锁、排它锁、Next-Key锁、间隙锁、X锁、S锁、IS锁、IX锁、死锁、索引与锁、意向锁等。 第五部分:彻底搞清楚Spring事务的7种传播级别的原理和使用:PROPAGATION_REQUIRED、PROPAGATION_SUPPORTS、PROPAGATION_MANDATORY、PROPAGATION_REQUIRES_NEW、PROPAGATION_NOT_SUPPORTED、PROPAGATION_NEVER、PROPAGATION_NESTED分布式事务的理论基础:RPC定理、BASE理论、XA协议都是什么,原理是什么,有什么关联关系 第六部分:分布式事务的5种解决方案原理和优缺点:2PC两阶段提交法、3PC三阶段提交法、TCC事务补偿、异步确保策略、最大努力通知策略 第七部分:阿里巴巴分布式事务框架Seata:历经多年双十一,微服务分布式事务框架,用一个Nacos+Spring Cloud+Seta+MySql的微服务项目,实战讲解阿里的分布式事务技术,深入理解和学习Seata的AT模式、TCC模式、SAGA模式。 课程资料: 课程附带配套2个项目源码72页高清PDF课件一份阿里巴巴seata-1.1.0源码一份阿里巴巴seata-server安装包一份

64,654

社区成员

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

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