请教

tqrc 2003-08-24 06:30:08
//书上说const int &r=10;
//编译器是这样处理的生成一个临时量temp,int temp=10;
//然后const int &r=temp,我只是把int换成了一个类而已
class num
{
int _num;
public:
num(int x=0):_num(x){}
num(const num& rhs)
{
_num=rhs._num;
cout<<"copy constructor!\n";
}
void operator=(const num& rhs)
{
_num=rhs._num;
cout<<"operator copy constructor!\n";
}
void print()
{
cout<<_num;
}
};

int main()
{
const num &E=6; // 因为要生成一个临时量并给其赋值应该调用我
// 定义的copy构造的可是没有看见有输出啊!为什么
return 0;
}
...全文
72 30 打赏 收藏 转发到动态 举报
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
tqrc 2003-08-26
  • 打赏
  • 举报
回复
我这里肯定调了 而且我觉得一定会调
就象单纯的写 num(100); 本身就生成了个对象
然后初始化函数的型参啊,不就要调copy 构造了吗
tqrc 2003-08-26
  • 打赏
  • 举报
回复
vc 6啊
tqrc 2003-08-26
  • 打赏
  • 举报
回复
up
oopig 2003-08-25
  • 打赏
  • 举报
回复
我已经说了,是作为int传给operator=函数的。
书上说会把int 转换为num是这个意思:
假设有个函数
void Handle(const num &n) {...}
你可以Handle(6)这么调用,编译器会根据6构造一个隐式的num对象传给Handle函数。
tqrc 2003-08-25
  • 打赏
  • 举报
回复

class num
{
int _num;
public:
num(int x=0):_num(x)
{
cout<<_num<<"constructor\n";
}
num(const num& rhs)
{
_num=rhs._num;
cout<<"copy constructor\n";
}
void operator=(const num& rhs)
{
_num=rhs._num;
cout<<"= constructor\n";
}
public:
~num()
{
cout<<"destructor\n";
}
void print()
{
cout<<_num<<endl;
}
};
void f(num t)
{
cout<<"begin\n";
t.print();
}
int main()
{
num TEST(100);
f(TEST); //这里调用了一个copy构造函数
f(9); //这里调用了一个构造函数,可是为什么没有调用copy构造啊
return 0; //应该作为实参传递给函数的呀
}
sevecol 2003-08-25
  • 打赏
  • 举报
回复
我这里没有调用copy呀?

调用copy的只是f(TEST),

你用的是什么编译器?
tqrc 2003-08-25
  • 打赏
  • 举报
回复
是否优化就是因为函数的参数传递就是初始化的原则
void f(num t);
f(9);在调用时就变为
num t(9);
而f(num(9));就是
num t=num(9);//先要构造一下num(9)这个对象?然后再调用copy 构造?
tqrc 2003-08-25
  • 打赏
  • 举报
回复
改成f(num(9)) 显示转换 然后去掉析构
就调用了copy了
sevecol 2003-08-25
  • 打赏
  • 举报
回复
去掉析构,我这里还是一样的。
tqrc 2003-08-25
  • 打赏
  • 举报
回复
再加50分 总共230分 呵呵
没钱了
tqrc 2003-08-25
  • 打赏
  • 举报
回复
对 如果优化 就没隐式转换了
那这里到底有没有优化啊 怎么知道哪里有优化


但是我把它改成f(num(9)) 还是没调用copy构造
但是我再把析构函数去掉 竟然调用了copy构造
为什么又和析构函数有关系了?

sevecol 2003-08-25
  • 打赏
  • 举报
回复
如果存在优化的话,直接调用num::num(int)来构建对象,不存在隐式转换。
tqrc 2003-08-25
  • 打赏
  • 举报
回复
我把它改成f(num(9)) 还是没调用copy构造
但是我再把析构函数去掉 竟然调用了copy构造
为什么又和析构函数有关系了?

楼上说编译器优化,那么也就是说按常例应该
是先隐式构造对象,然后再用copy构造放到函数里?
紫郢剑侠 2003-08-25
  • 打赏
  • 举报
回复
同意楼上的.
oopig 2003-08-25
  • 打赏
  • 举报
回复
你不重载operator=,那就根本编译不通过。重载了operator=后,也只是相当于一个普通的函数调用而已,不会有临时对象产生。
假设num有个Assign方法:
void num::Assign(int n) { _num = n; }
那么num T; T = 100;和num T; T.Assign(100);效果是一样的,100只是一个int参数,不会有临时对象产生。你可以把operator=理解为一个普通的函数调用,只是这个函数名字比较特殊一点而已。
sevecol 2003-08-25
  • 打赏
  • 举报
回复
f(9);

应该是编译器优化,直接使用9来构造接受传递的对象。
tqrc 2003-08-25
  • 打赏
  • 举报
回复
那种转换num(100)会自己产生一个对象吗
tqrc 2003-08-25
  • 打赏
  • 举报
回复
麻烦猪哥了 我已经清楚了
但是有个地方还是请赐教
“num T; T = 100;如果是前者,不会创建一个临时对象”
如果我不重载=
是否就会有临时变量产生
也就是说必须有个对象 才能赋值给T?
tqrc 2003-08-24
  • 打赏
  • 举报
回复
to steedhorse(晨星)
请你执行一下下面的代码:

class num
{
int _num;
public:
num(int x=0):_num(x)
{
cout<<"constructor\n";
}
~num()
{
cout<<"destructor\n";
}
void print()
{
cout<<_num;
}
};

int main()
{
const num &E=8; //num temp(8);
return 0;
}
tqrc 2003-08-24
  • 打赏
  • 举报
回复
我觉得前者和后者反正都要重载=
而且参数都让它为num temp好了
那对我这个问题来说不就没区别的
加载更多回复(10)

69,371

社区成员

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

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