返回信息流一个类c类对象obj, 定义了复制构造函数,
传递给函数f(), 那么在创建obj的副本时,是否会调用其定义的的复制构造函数,还是简单
的值复制? 突然想到这个问题,哪位大牛出来解释一下[em21]
这是一条镜像帖。来源:北邮人论坛 / cpp / #28628同步于 2009/9/17
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
[求助]关于类的按值传递的问题!!!!
littlefly
2009/9/17镜像同步8 回复
订阅后,新回复会通过你的通知中心匿名送达。
8 条回复
【 在 littlefly 的大作中提到: 】
: 一个类c类对象obj, 定义了复制构造函数,
: 传递给函数f(), 那么在创建obj的副本时,是否会调用其定义的的复制构造函数,还是简单
: 的值复制? 突然想到这个问题,哪位大牛出来解释一下[em21]
你的简单的值复制时什么意思?指默认的复制构造函数吗?
我认为是调用你定义的复制构造函数
【 在 littlefly 的大作中提到: 】
: 一个类c类对象obj, 定义了复制构造函数,
: 传递给函数f(), 那么在创建obj的副本时,是否会调用其定义的的复制构造函数,还是简单
: 的值复制? 突然想到这个问题,哪位大牛出来解释一下[em21]
这其实会产生一个临时对象,然后调用原来对象的拷贝构造函数对这个临时对象进行操作。
先创建临时对象?
那么应该调用的是赋值操作符(如果重载)或者默认赋值函数对这个临时对象进行操作,
还是说直接调用拷贝构造函数生成临时对象?
【 在 jmpesp 的大作中提到: 】
: 这其实会产生一个临时对象,然后调用原来对象的拷贝构造函数对这个临时对象进行操作。
传递类类型的参数调用拷贝构造啊~
要是自己定义了一个.就调用自定义的.未定义就调用默认的.
可以自己写个代码小测一下嘛...
//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;
}
我也试了,确实如此
【 在 HONG 的大作中提到: 】
: 传递类类型的参数调用拷贝构造啊~
: 要是自己定义了一个.就调用自定义的.未定义就调用默认的.
: 可以自己写个代码小测一下嘛...
: ...................
好了,我来详细讲解下。测试代码如下,随便写了一个:
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: }