C ++中的类和变量范围

时间:2012-02-01 21:40:16

标签: c++ class scope

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;
}

我认为可能会使用全局变量,或者是你无法确定的事情

6 个答案:

答案 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->

显式访问成员变量外