| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 454 人关注过本帖
标题:成员函数调用构造函数,请看例程
只看楼主 加入收藏
全世界安静
Rank: 2
等 级:论坛游民
帖 子:104
专家分:65
注 册:2012-6-4
结帖率:31.58%
收藏
已结贴  问题点数:10 回复次数:7 
成员函数调用构造函数,请看例程
#include <iostream.h>
#include <conio.h>
class A
{
public :
    A(){a=0;}
    A(int x)
    {
        a=x;
    }
   void show(int x)
     {
        A(x);
        cout<<a<<endl;
     }
private:
    int a;
};

void main()
{
  
    A a;
    a.show(2);
}
编译出错:error C2082: redefinition of formal parameter 'x'
搜索更多相关主题的帖子: public include void 
2012-06-17 10:31
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:3 
看你的代码……,我还是不说了

void show(int x)
{
    A(x);
}
相当于
void show(int x)
{
    A x;
}

如同
int(((a))) = 0;
相当于
int a = 0;
一样
2012-06-17 14:01
全世界安静
Rank: 2
等 级:论坛游民
帖 子:104
专家分:65
注 册:2012-6-4
收藏
得分:0 
回复 2楼 rjsp
函数show()中生成了一个A类对象,编译为什么会出错,说X重复定义?
2012-06-17 14:55
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:0 
抱歉。使楼主产生这个疑惑,可能那天楼主问 可不可以主动调用构造函数 的那个帖子,我回答的有点技术错误。不过楼主后来展示的代码确实很奇葩,我没想太清楚。

构造函数数有它自己的语法特殊性。其中一条是:不能通过函数名调用构造函数。(析构函数没有这个语法限制)
(标准里的原话是说构造函数没有函数名,也不会在构造函数上施用函数名回查(Because constructors do not have names, they are never found during name lookup;))。

有一种称作函数式类型转换的语法,类似 int a = int(4.4)。
当然把 int 换成类的名字也是可以的,标准说这种语法会引发构造函数的调用。但引发调用的机理是类型转换,而不是函数名调用。

楼主的代码相当于:
程序代码:
int main()
{
    int (a);
    a = 5;
    cout << a << endl;

    return 0;
}
那个括号是多余的,写不写都行。
在楼主的代码里,由于形参 int 已经是 x 了,代码里又定义了一个 类A的对象,也叫 x。所以提示重定义。

这点 2楼 已经说明了。如果楼主没看明白,不知道我举的这个例子,能不能帮助理解。
2012-06-17 17:36
全世界安静
Rank: 2
等 级:论坛游民
帖 子:104
专家分:65
注 册:2012-6-4
收藏
得分:0 
回复 4楼 pangding
在我的show()函数里,形参是int类型,函数体中生成的是A类型,虽然值一样,但是还是两个不同的变量吧
另外,主函数中定义的A类对象a是在show()函数外定义的,怎么会重复定义呢?
2012-06-17 18:43
lintaoyn
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:4
帖 子:606
专家分:2499
注 册:2009-4-8
收藏
得分:3 
A y = A(x);
单写A(x),那就像二楼说的那样。
我想楼主只是在语法问题上纠结了。
this->A::A(5);这样是能调用构造函数,标准里什么说的就不知道了。
类里还有个东西 是这样的
operator int()//这个int可以是其它的类名,这种转换函数声明那边没有返回值,但是得返回一个值回去。
{
return 2;
}
这个东西应该是四楼说的函数式类型转换的语法

迭代的是人,递归的是神。
2012-06-17 20:22
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:3 
回复 5楼 全世界安静
谁说你主函数了。你的 show 里不是声明了 A x 吗?
2012-06-17 23:46
liudw2
Rank: 4
等 级:业余侠客
帖 子:85
专家分:248
注 册:2011-7-31
收藏
得分:3 
A(x) 相当于A x,形参int x了,当然重定义啦
2012-06-18 01:21
快速回复:成员函数调用构造函数,请看例程
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.022761 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved