重载问题

zhangyu21101213 2009-02-18 04:59:03
有个问题:
关于重载函数的
1:
class A
{ operator int();
operator long();}

extern fun1(int);

mian
{
A a;

fun1(a);
}

2:
class A
{ operator int();
operator long();}

extern fun1(char);

mian
{
A a;

fun1(a);
}

3:
class A
{ operator int();
operator long();}

extern fun1(int);
extern fun2(long);

mian
{
A a;

fun1(a);
}

以上三个函数重载的解析过程是什么?如侯选->可行->最佳
我现在的理解是这样的:
如果存在多个标准转换和用户定义的转换序列,则在标准转换序列中查找(标准要优先于用户定义的序列);
如果全是用户定义的转换序列,分两种情况:1:如果只有一个侯选函数,则考虑所有的用户定义转换序列,即使转换序列使用了类的不同的转换函数或者是转换构造函数2:如果有多个侯选函数,则转换序列中必须使用了相同的用户定义的转换函数或者构造函数,否则就出现二义了.
...全文
140 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
pengzhixi 2009-03-04
  • 打赏
  • 举报
回复
侯选:在同一作用域,命名空间里找到函数名为调用函数名的所有函数
可行:根据函数调用的参数个数,类型,在侯选函数里面找到合适的函数.
最佳:1.参数个数和类型都匹配的.
2.参数个数相同,但类型可以提升到调用函数的参数类型的
3.通过一些标准转换可以转换到调用函数参数类型的.

记得就这么点了,等牛人详细讲解了.
insulted 2009-03-04
  • 打赏
  • 举报
回复
to lz, 3楼,12以及14楼和16楼的朋友

to 12楼和14楼的朋友:类的转换函数必须是无参无返的成员函数,即不能指定返回类型和参数表。lz一开始也没有搞清楚(3楼为证),不过他在4天后的半夜子时终于明白了(17楼为证)。

to 16楼的朋友:这不是运算符重载,这是类的转换函数。

to lz:你的code中对类A的定义里,应该把所有的转换函数放在公有区域里,类默认的访问权限是私有的。否则后面在main中函数调用时候,调用函数fun1(a)中的参数a的隐式转换就不能访问类A私有的转换函数operator int()了。

class A 
{ public: // 这句一定要加上!
operator int(){};
operator long(){};
};


最后,还要对lz说一声,你在提出问题后,急切的盼望大家给你一个答复(1楼为证),在有人帮你解答后,你积极参与讨论(3楼为证),并在得到满意答复后礼貌答谢大家的参与(11楼为证),更难能可贵的是在4天后重新返回这个帖子,及时更正了以后参与朋友的疑惑(17楼为证),以上种种迹象表明,你绝对是一个善于钻研技术的人才!
最后的最后,我还是忍不住要问lz一句:你为什么不结贴给分犒劳大家的积极参与呢?!
同意我以上观点的朋友,请你用最简单的方式回帖,将此贴顶起来,一直顶到lz结贴为止
zhangyu21101213 2009-02-22
  • 打赏
  • 举报
回复
OPERATOR 加类型名称是类的类型转换函数,不用指定返回类型,因为返回类型已经隐式的指定为OPERATOR后的类型名称了,所以,如果你在前面加了返回类型的话就错误了
chin_chen 2009-02-19
  • 打赏
  • 举报
回复
[Quote=引用楼主 zhangyu21101213 的帖子:]
有个问题:
关于重载函数的
1:
class A
{  operator int();
operator long();}

extern fun1(int);

mian
{
A a;

fun1(a);
}

2:
class A
{  operator int();
operator long();}

extern fun1(char);

mian
{
A a;

fun1(a);
}

3:
class A
{  operator int();
operator long();}

extern fun1(int);
extern fun2(long);

mian
{
A a;

fun1(a);
}

以上三个函数重载的解析过…
[/Quote]

你的重载运算符为啥不返回值了。。
zhangyu21101213 2009-02-19
  • 打赏
  • 举报
回复
谢谢楼上的!
我是LZ
这个问题说是重载也很牵强,只是想讨论下用户定义的转换序列的用法,再次感谢,确实不是什么好的重载例子,应该更名为转换序列的讨论!
nuoshueihe 2009-02-19
  • 打赏
  • 举报
回复
这是运算符重载
UndefinedCoder 2009-02-19
  • 打赏
  • 举报
回复
Sorry,
把int main(int argc,char *argv[])
写成
int main(int argc,char *argv)
了。
UndefinedCoder 2009-02-19
  • 打赏
  • 举报
回复

#include <iostream>

using namespace std;

extern void fun1(int i)
{
cout<<"get int value:"<<i<<endl;
};

extern void func2(long l)
{
cout<<"get long value:"<<l<<endl;
};

class A
{
public:
operator int()
{
cout<<"convert to int"<<endl;
return (int)56;
}
operator long()
{
cout<<"convert to long"<<endl;
return (long)65;
}
};


int main(int argc,char *argv)
{
A a;
fun1(a);
func2(a);
}



郁闷。
operator long()和operator int()
都没有申明返回类型,为什么可以return?
long operator long()和int operator int()
这样写反而错了
UndefinedCoder 2009-02-19
  • 打赏
  • 举报
回复
头一次看到这种操作符重载,见识了。
waizqfor 2009-02-18
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 insulted 的回复:]
1:
class A
{ operator int();
operator long(); }

extern fun1(int);

mian
{
A a;

fun1(a); // operator int()
}
2:
class A
{ operator int();
operator long();}

extern fun1(char);

mian
{
A a;

fun1(a); // 二义性!
}

3:
class A
{ operator int();
operator long();}

extern fun1(int);
extern fun2(long);

mian …
[/Quote]
UP
kiffa 2009-02-18
  • 打赏
  • 举报
回复
to lz: 标准转换和用户定义转换拥有不同的转换等级,或者说标准转换比用户定义转换“好”,而确定最佳可行函数,是通过确认实参到可行函数参数的转换序列的等级来进行的。标准转换或者用户定义转换只作为这个转换序列中的一部分,最终的选择还是要看整个转换序列中最“坏”的那一步转换。
kiffa 2009-02-18
  • 打赏
  • 举报
回复
to lz: 没有太理解你的代码以及你的意思。重载函数应该至少有两个同名的函数才存在重载,而你的代码1和代码2都只有1个函数,代码3有两个不同名的函数,何来的重载可言?

你的意思是否如下面这样:
class A
{ operator int();
operator long();
}

void fun(int);
void fun(long);
void fun(char);

int main()
{
A a;
fun(a); // 重载
}


kiffa 2009-02-18
  • 打赏
  • 举报
回复
to 2楼:
为什么我测试你的代码,和你结果不同呢?

//你的结果:
fun2(a);//: error C2664: 'fun2' : cannot convert parameter 1 from 'class A' to 'char'


我的测试结果是:error: 在A转换成char的过程中,“A 到 int 的转换” 和 “A 到 long 的转换”存在二义性。这很好理解。A 到 char可以通过先把A 转换成 int 或者 long,然后再转换成char的转换序列来进行。

不知道你用的是什么编译器。我的是gcc。
autotyx 2009-02-18
  • 打赏
  • 举报
回复
这是哪门子重载,见识了
Big鹏 2009-02-18
  • 打赏
  • 举报
回复

不错的题,关注下!!
insulted 2009-02-18
  • 打赏
  • 举报
回复
1:
class A
{ operator int();
operator long(); }

extern fun1(int);

mian
{
A a;

fun1(a); // operator int()
}
2:
class A
{ operator int();
operator long();}

extern fun1(char);

mian
{
A a;

fun1(a); // 二义性!
}

3:
class A
{ operator int();
operator long();}

extern fun1(int);
extern fun2(long);

mian
{
A a;

fun1(a); // operator int()
}
zhangyu21101213 2009-02-18
  • 打赏
  • 举报
回复
OPRATER 中你为什么不用RETURN,而用COUT<<?
我看懂你的程序,我只想知道,我自己的的总结对不对啊?
Dinelgua 2009-02-18
  • 打赏
  • 举报
回复
代码最能说明问题

class A
{
public:

operator int(){cout << "int\n";};
operator long(){cout << "long\n";};
} ;

extern int fun1(int){return 0;};
extern int fun2(char){return 0;};
extern int fun3(long){return 0;};

void main(void)
{
A a;

fun1(a);
//fun2(a);//: error C2664: 'fun2' : cannot convert parameter 1 from 'class A' to 'char'
fun3(a);
}
zhangyu21101213 2009-02-18
  • 打赏
  • 举报
回复
bang wo kan kan !

64,636

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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