【问题标题】:Classes and variables scope in C++C++ 中的类和变量范围
【发布时间】:2012-02-24 14:26:34
【问题描述】:
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) 指定了不同的变量,为什么它会起作用? 我虽然它应该给我一个编译时错误?

这段代码:它使用哪个变量?

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

我认为可能会使用全局变量,还是您无法确定的东西

【问题讨论】:

  • 实际上我厌倦了这样做。速度,编译器给了我一个错误,“this”没有定义。我记得我可以在不包含任何特殊标题的情况下做到“这个”,现在看来我不能。
  • 这个怎么样->速度=速度。记住:这是一个指针!
  • 为什么第一个会导致编译错误?
  • @Rave: this 在成员函数范围内始终是一个有效符号。总是。

标签: c++ class scope


【解决方案1】:
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;
}

【讨论】:

    【解决方案2】:

    参数名称并不重要。参数类型创建签名。签名相同,所以没有编译错误。

    在第二个示例中,构造函数中的速度将影响速度属性。因此,您将参数值分配给参数变量。你需要:

    这->速度=速度;

    这不是猜测 ;-)。

    【讨论】:

    • 我花了一分钟才弄清楚你的评论是什么......我最近在 C# 中学习的太多了。我在上面的评论中犯了同样的错误。
    【解决方案3】:

    这个构造函数不起作用

    car::car(int speed, double position){
       speed=speed;
       position=position;
    }
    

    因为它会将参数分配给自己。

    这个版本确实可以工作,因为类的范围规则有点奇怪

    car::car(int speed, double position) : speed(speed), position(position)
    {  }
    

    【讨论】:

      【解决方案4】:

      编译器不关心你在方法声明中的变量名,只关心签名,也就是

      car::car(int,double)

      对于你的构造函数声明和你的实现,所以它知道在链接时匹配它们。这是可能的,因为类中不能有两个具有相同签名的方法。 (您可以对子类执行此操作,但结果是覆盖)。

      【讨论】:

        【解决方案5】:

        在第二种情况下,我相信使用了最接近的范围变量。因此,首先它检查本地函数范围,并找到速度和位置,因此搜索停止在那里。实际上,第二个构造函数实际上并没有分配对象

        【讨论】:

          【解决方案6】:

          在您的代码中:

          car::car(int speed, double position){
             speed=speed;
             position=position;
          }
          

          您只是将每个变量的值分配给它自己。但是你可以这样做:

          car::car(int speed, double position)
            :speed(speed)
            ,position(position)
          {}
          

          除了通过this->显式访问成员变量

          【讨论】:

          • 如果我有一个私有成员 int *p;在构造函数中我这样做; this->p=new int;要分配值,我最终会这样做 *p=value;有没有办法用“这个”来做到这一点
          猜你喜欢
          • 2010-12-21
          • 2011-08-24
          • 1970-01-01
          • 2013-11-18
          • 2020-03-18
          • 2013-07-09
          • 2014-09-20
          • 1970-01-01
          • 2021-11-14
          相关资源
          最近更新 更多