class car {
int speed;
double position;
public:
car(int v,double d);
int getspeed();
};
int car::getspeed() {
return speed;
}
car::car(int s, double x){
speed=s;
position=x;
}
即使我为car(int s,v)指定了不同的变量,为什么它有效? 我虽然它应该给我一个编译时错误?
此代码:它使用哪个var?
class car {
int speed;
double position;
public:
car(int speed,double time);
int getspeed();
};
int car::getspeed() {
return speed;
}
car::car(int speed, double position){
speed=speed;
position=position;
}
我认为可能会使用全局变量,或者是你无法确定的事情
答案 0 :(得分:7)
car::car(int speed, double position){
speed=speed;
position=position;
}
在这个函数定义中,它对类成员car :: speed和car :: position没有任何作用,因为你在函数参数列表中声明了本地int speed和double position,它们隐藏了类成员变量。要正确地执行此操作,您需要明确说出:
car::car(int speed, double position){
this->speed=speed;
this->position=position;
}
答案 1 :(得分:4)
参数名称并不重要。参数类型创建签名。签名是相同的,因此没有编译错误。
在第二个示例中,构造函数中的速度将影子速度属性。因此,您将参数值分配给参数变量。你需要:
this-> speed = speed;
这不是猜测; - )。
答案 2 :(得分:2)
此构造函数不起作用
car::car(int speed, double position){
speed=speed;
position=position;
}
因为它将参数分配给自己。
由于类
的略微奇怪的范围规则,此版本 可以正常工作car::car(int speed, double position) : speed(speed), position(position)
{ }
答案 3 :(得分:1)
编译器不关心方法声明中的变量名,只关注签名,即
car::car(int,double)
对于构造函数声明和实现,因此它知道在链接时匹配这些。这是可能的,因为类中没有两个具有相同签名的方法。 (您可以使用子类执行此操作,但结果是覆盖)。
答案 4 :(得分:1)
在第二种情况下,我认为使用了最接近的范围变量。因此,首先它检查本地功能范围,并找到速度和位置,因此搜索停在那里。实际上,第二个构造函数实际上并没有指定obje
答案 5 :(得分:1)
在您的代码中:
car::car(int speed, double position){
speed=speed;
position=position;
}
您只是将每个变量的值分配给自己。但是你可以这样做:
car::car(int speed, double position)
:speed(speed)
,position(position)
{}
除了通过this->