返回对象的函数问题!

tsinghua 2001-11-17 09:12:50
问题1:实参传值给行参(不是对象的引用,也不是对象指针,就是class var),要调用拷贝构造函数吗?
问题2:返回一个对象的时候,钱能的那本书上,说要建立一个临时对象(建立的过程中要调用拷贝构造函数),再把这个临时对象再用拷贝构造函数给主函数里的对象赋值!可是我的发现并不是调用构造函数阿,谁能说说原因阿?!
例如!
#include<iostream.h>
class X
{
public:
X(int ia)
{
ia=2;
n++;
cout<<"creat a X!"<<" "<< n<<endl;

}

X(X& b)
{
ia=b.ia;
n++;
cout<<"used a copy construction!"<<" "<<n<<endl;
}
~X()
{

cout<<"delete a class"<<" "<<n<<endl;
n--;
}
void show(){ cout<<"\n"<<n<<endl;}
private:
int ia;
static int n;
};
int X::n=0;
X f()
{
cout<<"\nin funtion!"<<endl;
X b(1);
return b;
}
void main()
{
X b=f(); //按钱能的书上说该有两次的拷贝构造函数!可是结构只有一次!
}

问题3:下面这个程序,为什么结构不同,大家说说,看我的理解对不对!
××××××××××××××××××××
@@@ 为什么这两个 主程序运行后 的结果不同???

#include<iostream.h>
class X
{
public:
X(int ia)
{
ia=2;
n++;
cout<<"creat a X!"<<" "<< n<<endl;

}

X(X& b)
{
ia=b.ia;
n++;
cout<<"used a copy construction!"<<" "<<n<<endl;
}
~X()
{

cout<<"delete a class"<<" "<<n<<endl;
n--;
}
void show(){ cout<<"\n"<<n<<endl;}
private:
int ia;
static int n;
};
int X::n=0;
X f(X b)
{
cout<<"\nin funtion!"<<endl;
return b;
}
/*void main() ////第一种情况
{
X a(1);
X c(2);
X b=f(c);
b.show();
}
*/
void main() ////第二种情况
{
X a(1);
X b=f(X(2));
b.show();
}
...全文
47 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
mn_th 2001-11-17
  • 打赏
  • 举报
回复
1。是
2。拷贝构造函数不是一般的构造函数,主要用于赋值
3。情况1:第一次调用copy construction 勇于将c的值赋予f(b)中的b,第二次调用,勇于将f(b)中的b返回

karma 2001-11-17
  • 打赏
  • 举报
回复
1. yes
2. "建立的过程中要调用拷贝构造函数" 这句话有问题,起码在VC++6不是这样
3.

第一种情况
X a(1);
X c(2);
X b=f(c); c->形参b, 形参b ->本地b,调用两次拷贝构造函数
b.show();

第二种情况
X a(1);
X b=f(X(2)); 本地编译器发现X(2)是临时对象,编译器做了优化,直接传X(2)给形参b,所以只调用一次形参b ->本地b的拷贝构造函数
b.show();
november5 2001-11-17
  • 打赏
  • 举报
回复
1>同上
2> & 3>关键在于返回值的写法上!

X f()
{
X b(1);
return b;
}
X b = f();//一次构造,一次拷贝

X f()
{
return b(1);
}
X b = f();//注意只用了一次构造

明白了吗?

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧