关于单参数构造函数的问题

小水晶 2007-10-25 12:42:35
class A
{
private:
int _a;

public:
A(int a) : _a(a)
{
}
friend int f1(A&);
friend int f2(const A&);
friend int f3(A);
friend int f4(const A);
};

f1(0);调用就错误
f2(0);f3(0);f4(0);都可以.
后连个我明白,但f1和f2的区别在哪里呢?为什么一个行一个就不行呢
...全文
188 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhangyanli 2007-10-25
  • 打赏
  • 举报
回复
一般禁止这种构造函数转换,因为他太灵活,常常失控.
这样:
explicit A(int a) : _a(a)

一个也别想过去.
zhangyanli 2007-10-25
  • 打赏
  • 举报
回复
其实这里与编译器的实现相关的,按标准来说是可以的,除非你的c++编译器不支持标准.
BCB6是可以的,但是有一个警告,意思就是A&指向一个临时变量,而在c++标准中,是不允许
一个非const的引用指向一个临时存在的变量的
.在这里临时变量的作用域和引用的作用于相同
所以可以编译通过.

而在vc6中就没办法编译通过了."can't convert parameter 1 from const int to a class A& "
对这个错误具体我也说不太清楚.请高人指点了

还是按标准来吧,呵呵
YJ1973 2007-10-25
  • 打赏
  • 举报
回复
实际上就是下面几个
A& a=0; (1)
const A& a=0; (2)
A a=0; (3)
const A a=0; (4)

(3)(4)不用解释了

(1)不能编译通过 ,提示"不能将int类型转换成A& 类型"
(2)能通过,且 A的带参构造函数被调用.

在MSDN 中找到对&引用初始化的解释过程:


简单的E文,清楚了吧
lingsmallint 2007-10-25
  • 打赏
  • 举报
回复
还是临时对象的问题
thecorr 2007-10-25
  • 打赏
  • 举报
回复
理解错了。。。
晕。。

A& 好没有这个对象啊
而const A& 则在全局区构造这个对象
所以可以。
不知道对不对
  • 打赏
  • 举报
回复
你的f1是怎么写的.
thecorr 2007-10-25
  • 打赏
  • 举报
回复
编辑器能分辨出调用哪个么
thecorr 2007-10-25
  • 打赏
  • 举报
回复

int f1(A&);
int f3(A);



这样可以?

64,649

社区成员

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

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