BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #28628同步于 2009/9/17
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

[求助]关于类的按值传递的问题!!!!

littlefly
2009/9/17镜像同步8 回复
一个类c类对象obj, 定义了复制构造函数, 传递给函数f(), 那么在创建obj的副本时,是否会调用其定义的的复制构造函数,还是简单 的值复制? 突然想到这个问题,哪位大牛出来解释一下[em21]
订阅后,新回复会通过你的通知中心匿名送达。
8 条回复
LOVEBABY机器人#1 · 2009/9/18
【 在 littlefly 的大作中提到: 】 : 一个类c类对象obj, 定义了复制构造函数, : 传递给函数f(), 那么在创建obj的副本时,是否会调用其定义的的复制构造函数,还是简单 : 的值复制? 突然想到这个问题,哪位大牛出来解释一下[em21] 你的简单的值复制时什么意思?指默认的复制构造函数吗? 我认为是调用你定义的复制构造函数
Raiden机器人#2 · 2009/9/18
调用复制构造函数
jmpesp机器人#3 · 2009/9/18
【 在 littlefly 的大作中提到: 】 : 一个类c类对象obj, 定义了复制构造函数, : 传递给函数f(), 那么在创建obj的副本时,是否会调用其定义的的复制构造函数,还是简单 : 的值复制? 突然想到这个问题,哪位大牛出来解释一下[em21] 这其实会产生一个临时对象,然后调用原来对象的拷贝构造函数对这个临时对象进行操作。
littlefly机器人#4 · 2009/9/18
恩 【 在 LOVEBABY 的大作中提到: 】 : 你的简单的值复制时什么意思?指默认的复制构造函数吗? : 我认为是调用你定义的复制构造函数
littlefly机器人#5 · 2009/9/18
先创建临时对象? 那么应该调用的是赋值操作符(如果重载)或者默认赋值函数对这个临时对象进行操作, 还是说直接调用拷贝构造函数生成临时对象? 【 在 jmpesp 的大作中提到: 】 : 这其实会产生一个临时对象,然后调用原来对象的拷贝构造函数对这个临时对象进行操作。
hong机器人#6 · 2009/9/18
传递类类型的参数调用拷贝构造啊~ 要是自己定义了一个.就调用自定义的.未定义就调用默认的. 可以自己写个代码小测一下嘛... //classcopy.h #ifndef CLASSCOPY_H #define CLASSCOPY_H #include <iostream> using namespace std; class ClassCopy { public: ClassCopy(int a=0):a(a){} ClassCopy(const ClassCopy& src){//只输出,不复制,非常规做法,测试用 cout<<"in ClassCopy(const ClassCopy& src)"<<endl; } void print(){ cout<<"a:"<<a<<endl; } private: int a; }; #endif //test.cpp #include "classcopy.h" void func(ClassCopy arg) { cout<<"in func(ClassCopy arg)"<<endl; arg.print();//输出个随机值 } int main() { ClassCopy xxx(100); xxx.print();//输出100 func(xxx); return 0; }
littlefly机器人#7 · 2009/9/18
我也试了,确实如此 【 在 HONG 的大作中提到: 】 : 传递类类型的参数调用拷贝构造啊~ : 要是自己定义了一个.就调用自定义的.未定义就调用默认的. : 可以自己写个代码小测一下嘛... : ...................
jmpesp机器人#8 · 2009/9/18
好了,我来详细讲解下。测试代码如下,随便写了一个: class A { public: A (const A& a); A (){} int aa; int bb; int cc; int dd; }; A::A(const A& a) { printf("A Copy"); } void fn(A a) { int b = a.aa; int c = a.dd; } int main() { A a; fn(a); return 0; } 相应的反汇编如下: 004010B0 push ebp 004010B1 mov ebp,esp 004010B3 sub esp,54h 004010B6 push ebx 004010B7 push esi 004010B8 push edi 004010B9 lea edi,[ebp-54h] 004010BC mov ecx,15h 004010C1 mov eax,0CCCCCCCCh 004010C6 rep stos dword ptr [edi] 26: A a; 004010C8 lea ecx,[ebp-10h] 004010CB call @ILT+10(A::A) (0040100f) 27: fn(a); 004010D0 sub esp,10h //在栈中为临时对象分配内存 004010D3 mov ecx,esp //临时对象的this指针 004010D5 lea eax,[ebp-10h] //原来对象的this指针 004010D8 push eax //圧栈 004010D9 call @ILT+5(A::A) (0040100a) //调用临时对象的拷贝构造函数对临时对象进行拷贝操作 004010DE call @ILT+0(fn) (00401005) 004010E3 add esp,10h 28: return 0; 004010E6 xor eax,eax 29: }