Область классов и переменных в C ++ - PullRequest
0 голосов
/ 02 февраля 2012
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;
}

Несмотря на то, что я указал разные переменные для автомобиля (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;
}

Я думаю, что глобальная переменная может быть использована, или вы не можете сказать наверняка о

Ответы [ 6 ]

7 голосов
/ 02 февраля 2012
car::car(int speed, double position){
   speed=speed;
   position=position;
}

В этом определении функции она ничего не делает с классом-членом car :: speed и car :: position, потому что вы объявили локальную скорость int и двойную позицию в списке параметров функции, они скрывают переменные-члены класса. Чтобы сделать это правильно, нужно прямо сказать так:

car::car(int speed, double position){
   this->speed=speed;
   this->position=position;
}
4 голосов
/ 02 февраля 2012

Названия параметров не важны. Типы параметров создают подпись. Подпись такая же, поэтому ошибки компиляции нет.

Во втором примере скорость в конструкторе будет атрибутом скорости тени. Поэтому вы назначите значение параметра переменной параметра. Вам нужно:

это-> скорость = скорость;

И это не догадки; -).

2 голосов
/ 02 февраля 2012

Этот конструктор не работает

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

, потому что он присваивает параметры себе.

Эта версия работает из-за немного странных правил видимостикласс

car::car(int speed, double position) : speed(speed), position(position)
{  }
1 голос
/ 02 февраля 2012

В вашем коде:

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

вы просто присваиваете значение каждой переменной себе. Однако вы можете сделать:

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

в дополнение к явному доступу к переменным-членам через this->

1 голос
/ 02 февраля 2012

Во втором случае, я полагаю, используется ближайшая переменная области видимости.Итак, сначала он проверяет область действия локальной функции и находит как скорость, так и позицию, поэтому поиск на этом останавливается.По сути, второй конструктор фактически не присваивает объект

1 голос
/ 02 февраля 2012

Компилятору не нужны имена переменных в объявлении метода, только подпись, которая

car::car(int,double)

как для объявления конструктора, так и для вашей реализации, поэтомузнает, чтобы сопоставить их при связывании.Это возможно, потому что вы не можете иметь два метода в классе с одной и той же сигнатурой.(Вы можете сделать это с подклассами, но результат переопределит).

...