找回密码
 欢迎注册
楼主: winxos

[讨论] c++中的内部类重载问题

[复制链接]
发表于 2009-6-1 16:46:59 | 显示全部楼层
/*
    我还想实现的重载:
    比如如何实现 int i=b;
    其中b为Test类,这个操作实现将b.age赋值给i,请问如何实现?
    */
这个可以通过定义Test::operator int()来实现.
更一般的,将class A转化为class B,可以通过定义B的构造函数(参数为A或A&),也可以通过在class A中定义operator B()
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-6-1 16:50:52 | 显示全部楼层
还有一个问题:

  1.     friend ostream& operator << (ostream &out,Test &t)  //重载输出流
  2.     {
  3.         out<<"ID: "<<t.id<<"'s name is: "<<t.name<<"\tMy age is: "<<t.age<<"  Value:";
  4.         for (int i=0;i<5;i++)
  5.             out<<t.num[i]<<" ";
  6.         out<<endl;
  7.         return out;
  8.     }
复制代码
对于友元函数,其函数体最好不要放在类内部.因为这个函数不是类成员函数.在类内部最好只有一句函数声明.
而上面这种使用方法我不知道C++标准是否允许.(如果不允许,那么可能换一个编译器就不支持了).
而即使C++标准允许,我觉得这也不是好习惯.
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2009-6-1 17:33:30 | 显示全部楼层
看到mathe回答的这么仔细,真是谢谢mathe的悉心指点,浪费mathe的时间了。
搞了两三年的一个问题总算搞清楚了,mathe的回答很精辟

谢谢mathe
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2009-6-1 17:43:41 | 显示全部楼层
   Test operator ++ (int) //后缀重载,注意括号内一定是一个int而且不能在变量
    {
        Test ret(*this);    //后缀返回值不变
        this->age++;
        return ret; //编译时为何这里不会出现返回 ...
mathe 发表于 2009-6-1 16:38


return ret;跟return Test(ret);有什么区别呢?
是不是说ret的话,返回的是临时变量,但是如果重载了拷贝构造与赋值后,在析构前已经把ret的值复制出来了。
而Test(ret)的意思是说用ret生成一个无名对象,然后在将无名对象赋值给了接受者,比如说:a=(b++);在b++运算时候,最后生成ret析构前生成了无名对象Test(ret);然后将无名对象通过赋值号赋值给了a,而无名对象在赋值的时候是一定调用拷贝构造函数的。
不知道我以上的理解对么?

如果我理解的对的话,那么使用Test(ret)并且按引用返回以后,赋值给a前不会被析构,但是a会指向一个新的临时变量(就是那个无名对象),这样岂不是可以引用返回了?哪里分析的不对呢?
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-6-2 22:07:05 | 显示全部楼层
return ret;和return Test(ret);本质上没有区别.
后者相当于
Test tmp(ret);
return tmp;
也就是在函数内部再复制了一次对象,但是这个对象还是局部的.
这个问题其实还牵涉到函数返回值是如何传递的
如果返回值是简单类型(包含指针和引用),那么通常返回值直接通过寄存器eax(rax)返回.
如果返回值是对象,通常通过堆栈放回,具体方法就是函数调用时,在堆栈中留下保存对象的空间(但是没有调用对象的构造函数),而这段空间是调用者可以看到的,而在执行return x;时,对这段堆栈上保留的空间执行复制构造函数将内容复制到这段空间.但是如果返回类型是引用,那么就只是简单的将本地变量的地址设置到eax(同返回指针相同)

评分

参与人数 1威望 +2 鲜花 +2 收起 理由
winxos + 2 + 2 GOOD

查看全部评分

毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2009-6-3 08:25:11 | 显示全部楼层
15# mathe
return ret;和return Test(ret);本质上没有区别.

哦,原来没有区别,都是临时变量,以前被网上很多人的帖子搞晕了,很多误导了我。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2009-6-3 08:26:39 | 显示全部楼层
经过mathe的解惑,感觉已经讲的很清楚了,希望对各位不熟悉C++的新手们起到一定的帮助。
再次谢谢`mathe`


结贴
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2013-7-6 09:02:22 | 显示全部楼层
你们好强大
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2013-7-6 17:03:57 | 显示全部楼层
winxos 发表于 2009-6-3 08:25
15# mathe
return ret;和return Test(ret);本质上没有区别.

C++11 新增了右值引用和move操作 。
可以解决C++ 临时对象导致的性能问题。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

小黑屋|手机版|数学研发网 ( 苏ICP备07505100号 )

GMT+8, 2024-4-20 23:43 , Processed in 0.044728 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表