由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Programming版 - 问一个 copy constructor 的问题 (C++)
相关主题
问个copy constructor的问题C++ 中 myobject * a =new myobject[n] 的问题
c++ initialize structfind bugs of c++ codes
question about c++ constructorC++的一个小疑问,求解惑
copy constructor 问题C++ set ctor的疑问
抠字眼:assignment and initialize in C++C++ question
急问:compile and build dependency如何 initialize array member?
C++ questionTest your C++ knowledge...
C++ 问题c++ question
相关话题的讨论汇总
话题: copy话题: compiler话题: c++话题: ctor
进入Programming版参与讨论
1 (共1页)
n******m
发帖数: 169
1
Code 1
u****u
发帖数: 229
n******m
发帖数: 169
3
你的文章没有解决我的问题哦。。。
我的问题实际上是 a=1 这句话干了些什么:是(1)还是(2)呢?
(1)调用了 A(1), 生成a.
(2)调用了A(1), 生成了一个temporary object, 然后 “=”调用了copy constructor,
把temporary object 复制给a.
如果是(1),那么code2 应该不报错。实际上如果把 a=1 改成 a(1) 就能够顺利编译。
如果是(2),code2 应该报错,因为 A(A&) 屏蔽了系统自动给的copy constructor,
但是它的参数没法匹配 temporary object, 因为temp 都是 const 的。所以 code3 里
改成了 A(const A&). 但是输出结果显示copy constructor 根本没有被调用过。所以
不解。
感觉上compiler应该是能优化的,所以他的行为比较可能是(1),但是这样应该不报
错,所以不解阿
e****d
发帖数: 895
4
I think (2) is the case and the copy constructor is not called because
of compiler optimzation.

constructor,
译。
,

【在 n******m 的大作中提到】
: 你的文章没有解决我的问题哦。。。
: 我的问题实际上是 a=1 这句话干了些什么:是(1)还是(2)呢?
: (1)调用了 A(1), 生成a.
: (2)调用了A(1), 生成了一个temporary object, 然后 “=”调用了copy constructor,
: 把temporary object 复制给a.
: 如果是(1),那么code2 应该不报错。实际上如果把 a=1 改成 a(1) 就能够顺利编译。
: 如果是(2),code2 应该报错,因为 A(A&) 屏蔽了系统自动给的copy constructor,
: 但是它的参数没法匹配 temporary object, 因为temp 都是 const 的。所以 code3 里
: 改成了 A(const A&). 但是输出结果显示copy constructor 根本没有被调用过。所以
: 不解。

n******m
发帖数: 169
5
you mean (1) ba?
In (1) I mean compiler optimized in calling A(int) for 'a', without invoking
the copy constructor, even '=' presents.
In (2), I mean compiler does call copy constructor.

【在 e****d 的大作中提到】
: I think (2) is the case and the copy constructor is not called because
: of compiler optimzation.
:
: constructor,
: 译。
: ,

n******m
发帖数: 169
6
而且我还有个问题,一般在声明的时候用=,就有迹象表明用户想调用copy
constructor, 但是如果compiler这样自己优化了,不调用,那岂不是会搞出一些很难
查出的错?(例如用户定义的copy constructor比较特别的时候)
d****p
发帖数: 685
7
A a=1 doesn't invoke copy ctor; you can rewrite it as A a(1). So it is a
good practice to avoid the = form when initializing an object.
The compiler error is the missing const in your copy ctor declaration.

【在 n******m 的大作中提到】
: 而且我还有个问题,一般在声明的时候用=,就有迹象表明用户想调用copy
: constructor, 但是如果compiler这样自己优化了,不调用,那岂不是会搞出一些很难
: 查出的错?(例如用户定义的copy constructor比较特别的时候)

d****p
发帖数: 685
8
A a = 1
does the following things:
claim memory on stack in sizeof(A)
pass the address of the claimed memory to the first hidden parameter of A(
int) for invocation.
Execute A(int)
now a is initialized. There is no optimization involved.

constructor,
译。
,

【在 n******m 的大作中提到】
: 你的文章没有解决我的问题哦。。。
: 我的问题实际上是 a=1 这句话干了些什么:是(1)还是(2)呢?
: (1)调用了 A(1), 生成a.
: (2)调用了A(1), 生成了一个temporary object, 然后 “=”调用了copy constructor,
: 把temporary object 复制给a.
: 如果是(1),那么code2 应该不报错。实际上如果把 a=1 改成 a(1) 就能够顺利编译。
: 如果是(2),code2 应该报错,因为 A(A&) 屏蔽了系统自动给的copy constructor,
: 但是它的参数没法匹配 temporary object, 因为temp 都是 const 的。所以 code3 里
: 改成了 A(const A&). 但是输出结果显示copy constructor 根本没有被调用过。所以
: 不解。

t****t
发帖数: 6806
9
eworld is right. see 8.5, clause 12~14

【在 d****p 的大作中提到】
: A a=1 doesn't invoke copy ctor; you can rewrite it as A a(1). So it is a
: good practice to avoid the = form when initializing an object.
: The compiler error is the missing const in your copy ctor declaration.

d****p
发帖数: 685
10
Thats no point: A a(1) semantically identical to A a = 1. And the standard
has already indicated it may trigger move semantics.
Even the simplest compiler will do that without optimization turned on.

【在 t****t 的大作中提到】
: eworld is right. see 8.5, clause 12~14
相关主题
急问:compile and build dependencyC++ 中 myobject * a =new myobject[n] 的问题
C++ questionfind bugs of c++ codes
C++ 问题C++的一个小疑问,求解惑
进入Programming版参与讨论
p***o
发帖数: 1252
11

They are different. The second one requires the ctor to be non-explicit.

【在 d****p 的大作中提到】
: Thats no point: A a(1) semantically identical to A a = 1. And the standard
: has already indicated it may trigger move semantics.
: Even the simplest compiler will do that without optimization turned on.

n******m
发帖数: 169
12
en....
at this point I believe 'A a=1' does one more thing than 'A a(1)', that is
it check for sure the existence of a correct copy constructor. otherwise,
code2 will not report error.

【在 d****p 的大作中提到】
: A a = 1
: does the following things:
: claim memory on stack in sizeof(A)
: pass the address of the claimed memory to the first hidden parameter of A(
: int) for invocation.
: Execute A(int)
: now a is initialized. There is no optimization involved.
:
: constructor,
: 译。

p***o
发帖数: 1252
13

You are not supposed to have those special things in a copy ctor ...

【在 n******m 的大作中提到】
: 而且我还有个问题,一般在声明的时候用=,就有迹象表明用户想调用copy
: constructor, 但是如果compiler这样自己优化了,不调用,那岂不是会搞出一些很难
: 查出的错?(例如用户定义的copy constructor比较特别的时候)

d****p
发帖数: 685
14
Hmmm. That's right.
So A a = 1 is
..A tmpA(1);
..A a = tmpA;
But optimization comes in.
Sorry for my previous post that is misleading.

【在 n******m 的大作中提到】
: en....
: at this point I believe 'A a=1' does one more thing than 'A a(1)', that is
: it check for sure the existence of a correct copy constructor. otherwise,
: code2 will not report error.

o*******0
发帖数: 699
15
那就是说
A a = 1; 和 A a(1); 在这里是等同的了?
我在VS2010 上试, copy constructor without const 没问题啊?

【在 d****p 的大作中提到】
: Hmmm. That's right.
: So A a = 1 is
: ..A tmpA(1);
: ..A a = tmpA;
: But optimization comes in.
: Sorry for my previous post that is misleading.

p***o
发帖数: 1252
16
VC allows to bind temporary objects to non-const references,
which is not allowed by the standard. You need to use gcc for
this example.

【在 o*******0 的大作中提到】
: 那就是说
: A a = 1; 和 A a(1); 在这里是等同的了?
: 我在VS2010 上试, copy constructor without const 没问题啊?

t****t
发帖数: 6806
17
A a=1 is roughly equivalent to A a=A(1). however the first expression
requires the constructor A::A(int) to be non-explicit.
never mind how VS thinks your c++ program.

【在 o*******0 的大作中提到】
: 那就是说
: A a = 1; 和 A a(1); 在这里是等同的了?
: 我在VS2010 上试, copy constructor without const 没问题啊?

1 (共1页)
进入Programming版参与讨论
相关主题
c++ question抠字眼:assignment and initialize in C++
c++问题,请高人指点迷津,c++ faq lite的一个例子急问:compile and build dependency
包含指针的类和vector的问题C++ question
vector在constructor里初始化C++ 问题
问个copy constructor的问题C++ 中 myobject * a =new myobject[n] 的问题
c++ initialize structfind bugs of c++ codes
question about c++ constructorC++的一个小疑问,求解惑
copy constructor 问题C++ set ctor的疑问
相关话题的讨论汇总
话题: copy话题: compiler话题: c++话题: ctor