有如下程序: #include using namespace std; class Con {

有如下程序:
#include
using namespace std;
class Con
{
char ID;
public:
Con():ID('A'){cout<<1;}
Con(char I
D.:ID(I
D.{cout<<2;}
Con(Con&
C.:ID(c.getID()){cout<<3;}
char getID() const{return ID;}
};
void show(Con
C.{cout<
int main()
{
Con c1;
show(c1);
Con c2('B');
show(c2);
return 0;
}
执行上面程序的输出是 13A23B
我想问那个3怎么来的

也不知道你怎么复制的,你的程序都不完整,不过程序很简单,所以我帮你补全了!
#include <iostream>
using namespace std;
class Con
{
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;
}

private:
char ID;
};

void show(Con c)
{
cout << c.getID();
}

int main()
{
Con c1;
show(c1);
Con c2('B');
show(c2);
cout << endl;
return 0;
}

解答开始:从你的实现来说3只有在调用拷贝构造函数(copy constructor)时才会被输出,当然也正是由于发生了拷贝构造,所以才输出了(有点废话了)。发生复制对象的地方时show函数的调用,你的show函数参数是以值传递的方式传入的,所以在调用show的时候,会先复制一个传入的对象,也就是生成一个副本。show(c1)和show(c2)分别生成了两个副本,也就有两次拷贝构造函数的调用。这就是为什么会出现3的原因。
下面我在跟你说说如何不让出现3。
将show函数做一下修改:
void show(const Con& c)
{
cout << c.getID();
}
这个是以const引用的方式传入的,引用方式(另外一个是非const引用)是不产生对象副本的,对应于值传递(产生对象副本)。通常情况下很少会使用值传递,在不修改传入参数的情况下(show就是这样,只是输出,不做修改)使用const引用代替值传递,这样做的好处你的例子里已经得到结论了——不产生不必要的临时对象。而在调用函数需要修改传入参数的情况下则必须使用对象的引用或者对象的指针,传入值是不行的(因为传入的是该对象的一个副本,并非对象本身),引用则表示就是对象本身【const表示传入的对象不能被修改,非const则表示可以修改】。如果还有不明白的,可以在问题,不过不一定及时回复!
温馨提示:内容为网友见解,仅供参考
无其他回答

有如下程序: #include using namespace std; class Con {
include <iostream> using namespace std;class Con { 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;} private:char ID;};void show(Con c){ cout << c.getI...

...#include<iostream>using namespace std;class B{public;virtual void...
一个环节,内部嵌套着一系列复杂的列逻辑慎密的一个组件,如若一个地方出问题则会影响到整个主体(可以理解为事务)。任何单位任何事情,首先强调的就是程序,因为管理界有句名言:细节决定成败。程序就是整治细节最好的工具。于是,我们的所有工作,无时无处不在强调程序。因为有了规范的办事程序,我们这...

写出下面程序的运行结果:#include<iostream> using namespace std;
class D class C

# include< iostream> using namespace std;
出错原因:函数调用头文件中的库函数时,查不到所需函数出错,即头文件的错,C语言的头文件与C++的头文件混淆导致错误。解决方案两种方法:1、#include <iostream> include <cmath> using namespace std;2、#include <iostream> include <math.h> using namespace std ...

...结果:#include<iostream> using namespace std; template<class T>...
步骤一:进入Metro界面,找到Word 2010、Powerpoint 2010等软件的快捷图标;步骤二:鼠标右键单击“Microsoft Word 2010”图标,在下方会弹出一个操作选项,点击“打开文件位置”。注意:这里不要同时选择多个,否则不会有“打开文件位置”选项 步骤三:点击后就打开了程序所创建快捷方式的开始菜单目录,这里...

各位大牛帮忙看看这段程序吧。编译没什么错误,计算加法没错误,当计算...
include <iostream> using namespace std;class Clock { public:Clock(int h=0,int m=0,int s=0){ if(h>=0&&h<24&&m>=0&&m<60&&s>=0&&s<60){ Hour=h;Minute=m;Second=s;} else cout<<"时间输入错误!"<<endl;} void ShowTime(){ cout<<Hour<<":"<<Minute<<":"<<Second...

求用C++编写程序!!急!!
include<iostream> using namespace std;class Cow{ public:Cow() :age(0),weight(50){} Cow(double w):age(0),weight(w){} float Age(){ return age; } float Weight(){ return weight; } void Drink(){ age += 0.1; weight += 20; } void Eat() {age += 0.1; weight +...

...是: #include<iostream> using namespace std; int main() { co...
没结束的分号,只输了一个括号。这么写试试 include<iostream> using namespace std;int main(){ cout << "HELLO,WORLD!";}

# include <iostream> using namespace std; int main( ) { cout<...
include <iostream> using namespace std; int main() { cout << "this is a C++ program."; return 0; } 在编译系统里,宏是首先被宏处理器处理,得到完整的C++源代码文件,然后再由编译器处理……。所以,除了宏所必须的部分,C++代码不能得宏在同一行。有的时候,你用Unix系列的操作系统...

#include <iostream> using namespace std; int main() { int a,m...
结果是16,当i=‘e’时第一个循环最后一次运行,e在ascII中是101;for (j=5;j>=0;j--)m+=(i-100)*j;相当于 for (j=5;j>=0;j--)m+=(101-100)*j;m初始值为1;所以m=5+4+3+2+1+1=16

相似回答