C++拷贝构造函数问题

看程序:
#include<iostream>
using namespace std;
class con
{char ID;
public:
con():ID('A'){cout<<1;}
con(char ID):ID(ID){cout<<2;}
con(con&c):ID(c.getID()){cout<<3;}
char getID()const{return ID;}
};
void show(con){cout<<c.getID();}
int main()
{ con c1;
show(c1);
con c2('B');
show(c2);
return 0;
}

问题:我知道在用一个对象初始化另外一个对象时调用复制构造函数,但是对于本题来说,我不明白哪里调用了复制构造函数????能不能详细的解答一下???尤其是怎么调用的复制构造函数??

此篇代码根本没有调用拷贝构造函数,拷贝构造函数只有在两种情况下会被调用:1、使用类去初始化一个类。
例如:对你的代码做一定修改。
con c1('a');
con c2(c1); //这里会调用拷贝构造。基本属于显示的调用了。
2、调用函数时函数返回一个类的变量。
例如重写你的代码
con show(con c3)
{
con c4('c');
return c4; //此时调用拷贝构造函数。程序内部调用,拷贝一个临时变量返回给调用处
}
温馨提示:内容为网友见解,仅供参考
第1个回答  2009-09-06
两次调用show函数都会调用复制构造函数
因为show函数的参数是con类型,不是con引用
所以在函数压栈的时候会在栈内生成临时对象.

其实你对函数调用的过程还不是很理解。本回答被提问者采纳
第2个回答  2009-09-06
void show(con c){cout<<c.getID();}

是调用函数 show时调用了复制构造函数,
因为函数的实参实际上是生成的复本,所以会调用复制构造函数,

show 改成 引用形式的参数就不会调用了,这样效率会提高,省去了复制参数的过程
void show(const con &c){cout<<c.getID();}
第3个回答  2009-09-06
值传递对象。

C++拷贝构造函数(深拷贝与浅拷贝)
结论是,C++中的拷贝构造函数在类对象复制过程中起着关键作用,特别是深拷贝与浅拷贝的区别。让我们深入理解这个概念。在C++中,当一个类对象需要被复制时,如果没有显式定义拷贝构造函数,编译器会自动生成一个默认的浅拷贝构造函数,它执行的是简单的位拷贝,即对象成员的值被复制,而非资源的完整复制。

c++中拷贝构造函数问题
在C++中,下面三种对象需要调用拷贝构造函数(有时也称“复制构造函数”):1) 一个对象作为函数参数,以值传递的方式传入函数体;2) 一个对象作为函数返回值,以值传递的方式从函数返回;3) 一个对象用于给另外一个对象进行初始化(常称为复制初始化);这里我们就说说第三种情况:point A(3,5);\/...

问一个C++构造函数的问题
默认构造函数只在没有定义任何构造函数的时候系统才会自动生成。拷贝构造函数也是构造函数 拷贝构造函数在没有显示定义的情况下系统会自动生成一个默认的拷贝构造函数 b项如果定义了带参数的构造函数,也不会生成默认构造函数了,所以是错的

C++中关于strcpy函数的问题
字符串都是以0结尾的字符数组,所以1中只拷贝第一个字符。因为,S2和S1指向同一个字符串,所以S1和S2的内容都变了 2拷贝整个字符串从N到S1, 因为,S2和S1指向同一个字符串,所以S1和S2的内容都变了 3,指针的复制,S1不在像原来那样指向S2而是指向N了,所以 S2的内容没有变 ...

拷贝构造函数X::X(X)在C++中是非法的,请解释其原因。
在C++中,下面三种对象需要拷贝的情况。因此,拷贝构造函数将会被调用。1). 一个对象以值传递的方式传入函数体 2). 一个对象以值传递的方式从函数返回 3). 一个对象需要通过另外一个对象进行初始化 当实现程序时,当一个对象以传递值的方式传入这个函数的时候,拷贝构造函数自动的被调用来生成函数...

C++中的拷贝构造函数(Copy Constructor)
本文为C++构造函数和赋值运算符系列的一部分,主要讲述了拷贝构造函数的相关内容。拷贝构造函数是一种特殊类型的构造函数,它允许使用同一类型的实参进行调用,并复制该实参的内容,而不会修改实参本身。拷贝构造函数有多种写法,包括单形参列表和多形参列表。其中,单形参列表的拷贝构造函数主要有四种写法,...

一个c++关于拷贝构造函数被调用次数的问题
Myclass obj3(obj1); \/\/直接调用拷贝构造函数 obj2=fun(obj3);\/\/调用三次,第一次是参数按值传递,使用拷贝构造函数创建了一个临时对象。第二次是函数内部使用拷贝构造函数初始化局部对象temp,第三次是按值返回需要用拷贝构造函数创建临时对象。

关于C++构造函数、拷贝函数、析构函数调用问题,问题与答案详情见图 请...
1.运行foofun函数时,由于它的参数是对象 当t1对象传入形参时,会先会产生一个临时变量,就叫 A吧。然后调用拷贝构造函数把t1的值给A。2.由于foofun函数是 对象以值传递的方式从函数返回 执行到return时,先会产生一个临时变量,就B吧。然后调用拷贝构造函数把t1的值给B,因为foofun函数调用setvalue...

C++:为什么复制构造函数的参数一般是const型的?
因此要防止复制构造函数内部修改该引用,所以用const声明。class A { int x;A(int c){x=c;};A(const A & c){x=c.x}; \/\/ 复制构造函数 } void main(){ class A a1(10);class A a2(a1); \/\/ 在用a1构造a2的时候,你当然不希望a1会被改变。} ...

C++ operator=的问题
这里涉及到拷贝构造函数调用get()函数的参数匹配问题。在拷贝构造函数中,形参是 const num &r,就是说,形参由const修饰,但当调用get()函数时,由于没有显式声明该函数不修改参数的值(事实上也不修改),编译程序认为,用const形参调用非const形参函数时,不能保证get()不修改参数的值,所以发出错误...

相似回答
大家正在搜