функция внутри объектов oop - PullRequest
0 голосов
/ 29 марта 2020

Я не понимаю, какой смысл иметь функцию внутри объекта, если вы, например, можете изменять данные вне объекта (я использую struct для этого примера):

int lamborghini_horsepower1 = 350;
struct car {
    string model;
    string color;
    int horsepower;

    void check(int horsepower) {
        if (horsepower > 349) {
            cout << "this car has many horsepowers";
        }
    }
};
car ford;
ford.check(lamborghini_horsepower1);

в этом случае он будет работать в любом случае. Было бы разумно, если бы функция могла работать только внутри данных объекта, потому что, как говорится, они являются данными объекта и почему функция может обращаться к другим переменным? например, что если вы передадите другую переменную, в этом случае lamborghini_horsepower не является частью объекта ford. и все еще может быть проверено функцией ford, даже если они разные.

для класса разные?

Ответы [ 2 ]

0 голосов
/ 30 марта 2020

для разных классов?

Классы не доступны извне по умолчанию, поэтому, если вы сделали

class car{
    string model;
    string color;
    int horsepower;

    void check(int horsepower) {
        if(horsepower>349)
        {
            cout << "this car has many horsepowers";
        }
    }
};

, тогда ничего в этой структуре не будет доступны снаружи класса. Но есть способ изменить то, к каким переменным и функциям можно обращаться извне с помощью модификаторов доступа .

Цель сделать функции и переменные недоступными вне объекта - защитить их от непреднамеренный вызов или изменение

Короткий ответ: ваш пример не очень эффективен для объектов. Я бы просто оставил функцию вне структуры в этом примере.

Цель классов и структур - поместить переменные и функции в один пакет. Пример, который у вас есть, не требует объекта. Основа проектирования объектов - имитировать c объекты реального мира, предоставляя им способности (функции) и свойства (переменные).

Функция check() здесь не та, которую мы обычно находим в автомобилях. Вместо этого у автомобиля есть определенные свойства, такие как цвет, скорость и направление. Автомобиль также обладает такими способностями, как ускорение, разворот, поворот налево и поворот направо. С помощью этого мы можем создать автомобильный объект с этими свойствами (переменными) и способностями (функциями)

struct Car
{
    int speed;
    std::string color;
    std::string direction;

    Car()       // As soon as the object is created, this function will be called and set speed to 0.
    {
        speed = 0;
    }
    void speedUp()
    {
        speed += 5;
    }

    void slowDown()
    {
        speed -= 5;
    }

    void stop()
    {
        speed = 0;
    }

    void reverse()
    {
        stop() // This will stop the car first
        speed -= 2; // Move the car backwords
    }
    void turnLeft()
    {
        direction = "left";
    }
    void turnRight()
    {
        direction = "right";
    }
};

Так что теперь вы можете создавать разные объекты одного класса \ структуры с разными скоростями, направлением и цветом.

0 голосов
/ 30 марта 2020

В структурах функции не оказывают большого влияния, потому что данные могут быть изменены извне. Тем не менее, они все еще могут выступать в качестве удобной функции, особенно при правильном написании. Ваша функция принимает horsepower в качестве аргумента, что не нужно, поскольку horsepower уже является полем в структуре. Если вы измените свою функцию на:

void check() {
    if (horsepower > 349) {
        cout << "this car has many horsepowers" << endl;
    }
} 

, вы можете вызвать ее с помощью ford.check(), и она автоматически получит horsepower из переменной ford. В классах поля могут быть объявлены как частные, что означает, что к ним нельзя получить доступ извне, и должен быть модифицирован исключительно с помощью функций, определенных внутри класса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...