我还想实现的重载:
比如如何实现 int i=b;
其中b为Test类,这个操作实现将b.age赋值给i,请问如何实现?
*/
这个可以通过定义Test::operator int()来实现.
更一般的,将class A转化为class B,可以通过定义B的构造函数(参数为A或A&),也可以通过在class A中定义operator B() 还有一个问题:
friend ostream& operator << (ostream &out,Test &t)//重载输出流
{
out<<"ID: "<<t.id<<"'s name is: "<<t.name<<"\tMy age is: "<<t.age<<"Value:";
for (int i=0;i<5;i++)
out<<t.num<<" ";
out<<endl;
return out;
}
对于友元函数,其函数体最好不要放在类内部.因为这个函数不是类成员函数.在类内部最好只有一句函数声明.
而上面这种使用方法我不知道C++标准是否允许.(如果不允许,那么可能换一个编译器就不支持了).
而即使C++标准允许,我觉得这也不是好习惯. 看到mathe回答的这么仔细,真是谢谢mathe的悉心指点,浪费mathe的时间了。
搞了两三年的一个问题总算搞清楚了,mathe的回答很精辟:b:
谢谢mathe Test operator ++ (int) //后缀重载,注意括号内一定是一个int而且不能在变量
{
Test ret(*this); //后缀返回值不变
this->age++;
return ret; //编译时为何这里不会出现返回 ...
mathe 发表于 2009-6-1 16:38 http://bbs.emath.ac.cn/images/common/back.gif
return ret;跟return Test(ret);有什么区别呢?
是不是说ret的话,返回的是临时变量,但是如果重载了拷贝构造与赋值后,在析构前已经把ret的值复制出来了。
而Test(ret)的意思是说用ret生成一个无名对象,然后在将无名对象赋值给了接受者,比如说:a=(b++);在b++运算时候,最后生成ret析构前生成了无名对象Test(ret);然后将无名对象通过赋值号赋值给了a,而无名对象在赋值的时候是一定调用拷贝构造函数的。
不知道我以上的理解对么?
如果我理解的对的话,那么使用Test(ret)并且按引用返回以后,赋值给a前不会被析构,但是a会指向一个新的临时变量(就是那个无名对象),这样岂不是可以引用返回了?哪里分析的不对呢? return ret;和return Test(ret);本质上没有区别.
后者相当于
Test tmp(ret);
return tmp;
也就是在函数内部再复制了一次对象,但是这个对象还是局部的.
这个问题其实还牵涉到函数返回值是如何传递的
如果返回值是简单类型(包含指针和引用),那么通常返回值直接通过寄存器eax(rax)返回.
如果返回值是对象,通常通过堆栈放回,具体方法就是函数调用时,在堆栈中留下保存对象的空间(但是没有调用对象的构造函数),而这段空间是调用者可以看到的,而在执行return x;时,对这段堆栈上保留的空间执行复制构造函数将内容复制到这段空间.但是如果返回类型是引用,那么就只是简单的将本地变量的地址设置到eax(同返回指针相同) 15# mathe
return ret;和return Test(ret);本质上没有区别.
哦,原来没有区别,都是临时变量,以前被网上很多人的帖子搞晕了,很多误导了我。:L 经过mathe的解惑,感觉已经讲的很清楚了,希望对各位不熟悉C++的新手们起到一定的帮助。
再次谢谢`mathe`
结贴 你们好强大 winxos 发表于 2009-6-3 08:25
15# mathe
return ret;和return Test(ret);本质上没有区别.
C++11 新增了右值引用和move操作 。
可以解决C++ 临时对象导致的性能问题。
页:
1
[2]