注册 登录
编程论坛 C++教室

成员函数调用构造函数,请看例程

全世界安静 发布于 2012-06-17 10:31, 454 次点击
#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'
7 回复
#2
rjsp2012-06-17 14:01
看你的代码……,我还是不说了

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

如同
int(((a))) = 0;
相当于
int a = 0;
一样
#3
全世界安静2012-06-17 14:55
回复 2楼 rjsp
函数show()中生成了一个A类对象,编译为什么会出错,说X重复定义?
#4
pangding2012-06-17 17:36
抱歉。使楼主产生这个疑惑,可能那天楼主问 可不可以主动调用构造函数 的那个帖子,我回答的有点技术错误。不过楼主后来展示的代码确实很奇葩,我没想太清楚。

构造函数数有它自己的语法特殊性。其中一条是:不能通过函数名调用构造函数。(析构函数没有这个语法限制)
(标准里的原话是说构造函数没有函数名,也不会在构造函数上施用函数名回查(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楼 已经说明了。如果楼主没看明白,不知道我举的这个例子,能不能帮助理解。
#5
全世界安静2012-06-17 18:43
回复 4楼 pangding
在我的show()函数里,形参是int类型,函数体中生成的是A类型,虽然值一样,但是还是两个不同的变量吧
另外,主函数中定义的A类对象a是在show()函数外定义的,怎么会重复定义呢?
#6
lintaoyn2012-06-17 20:22
A y = A(x);
单写A(x),那就像二楼说的那样。
我想楼主只是在语法问题上纠结了。
this->A::A(5);这样是能调用构造函数,标准里什么说的就不知道了。
类里还有个东西 是这样的
operator int()//这个int可以是其它的类名,这种转换函数声明那边没有返回值,但是得返回一个值回去。
{
return 2;
}
这个东西应该是四楼说的函数式类型转换的语法
#7
pangding2012-06-17 23:46
回复 5楼 全世界安静
谁说你主函数了。你的 show 里不是声明了 A x 吗?
#8
liudw22012-06-18 01:21
A(x) 相当于A x,形参int x了,当然重定义啦
1