Объектно-ориентированное программирование (ООП), одна из самых интересных тем в программировании, имеет много преимуществ по сравнению с процедурным программированием. Мы также обсудим некоторые важные методы ООП, такие как Инкапсуляция, Наследование, Полиморфизм, Абстракция. В этой серии уроков мы будем в основном использовать C++ для лучшего понимания . Но те же концепции применимы и к другим объектно-ориентированным языкам.

Сорт

Классы можно определить как прототип, идею, шаблон или схему объекта. Классы — это "строительные блоки" объектно-ориентированного программирования (ООП). Класс содержит свои собственные члены данных и функции-члены, доступ к которым и их использование можно получить, создав экземпляр этого класса. При объявлении класса память не выделяется.

Члены данных:переменные внутри определения класса
Функции-члены:определения функций, которые находятся внутри класса или те, которые присутствуют вне класса, но принадлежат классу

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

class Student{
    // Access specifier
        // Data members
        // Member functions
};

Объект

Объект — это экземпляр класса. Память создается только после инициализации объекта, пока память не будет выделена. Объекты — это те, которые имеют состояние и поведение. Здесь состояниеозначает данные, а поведениеозначает функциональность.

Для класса может быть создано «n» объектов. Объект можно создать, используя имя класса, за которым следует имя объекта.

Student a; // an object 'a' is created for the class Student

Функция конструктора

Функция Constructor — это, по сути, функция, которая вызывается автоматически всякий раз, когда объект создается для класса. Функция-конструктор похожа на функцию по умолчанию , которая будет выполняться, если мы получим доступ к классу.

Функция Constructor имеет имя функции, такое же, как имя класса. В функции-конструкторе не будет возвращаемых значений, следовательно, нет возвращаемого типа. Конструкторы чаще всего объявляются в разделе public класса.

class Student{
public:
     Student(){
        cout << "Enter the RollNo:";
        cin >> rno;
        cout << "Enter the Name:";
        cin >> name;
    }
}

Здесь при доступе к Class Student автоматически вызывается и выполняется функция-конструктор.

Даже если мы не объявляем функцию-конструктор, компилятор автоматически создает функцию-конструктор при создании объекта для определенного класса.

Конструкторы бывают трех типов:
1. По умолчанию
2. Параметризованные (конструкторы с аргументами)
3. Копирующие конструкторы

Функция деструктора

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

Деструкторы также имеют то же имя, что и класс, которому предшествует символ тильда (~). Деструктор также не имеет типа возврата и аргументов.

class Student{
public:
     Student(){                         //Constructor
        cout << "Enter the RollNo:";
        cin >> rno;
        cout << "Enter the Name:";
        cin >> name;
    }
     ~Student();                        //Destructor
}

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

Спецификаторы доступа

Модификаторы доступа (или спецификаторы доступа) — это ключевые слова в объектно-ориентированных языках, которые устанавливают доступность классов, методов и других членов.

Надеюсь, вы заметили, что в приведенных выше кодах примеров конструктора и деструктора есть что-то, называемое «public». Они называются спецификаторами доступа. Эти спецификаторы доступа используются для определения области действия переменной, т. е. того, можно ли получить доступ к переменным, объявленным в классе, где угодно, в производном классе или нельзя получить доступ где угодно.

Спецификаторы доступа:
1. Общедоступные
2. Частные
3. Защищенные

Общественный

Переменные или функции, объявленные с помощью этих «общедоступных» спецификаторов доступа, могут быть доступны в любом месте в программе, т. е. к ним можно получить доступ вне класса.

class Student{
public:
    int roll_no;
}
int main(){
    Student A;
    cout >> A.roll_no;  //Valid
    return 0;
}

Защищено

Доступ к переменным под «защищенными» спецификаторами доступа возможен внутри класса, а также в производном классе, но не за пределами класса.

class Student{
protected:
    int roll_no;
}
class Child_student : public Student{
    public:
        int new_rollno = roll_no + 1;  //Can access protected 
                                         roll_no from this derived 
                                         class
}
int main(){
    Student A;
    cout >> A.roll_no;  //Invalid
    return 0;
}

Частный

Доступ к закрытым переменнымневозможен за пределами того же класса.

class Student{
private:
    int roll_no;
}
class Child_student : public Student{
    public:
        int new_rollno = roll_no + 1;  //Invalid
}
int main(){
    Student A;
    cout >> A.roll_no;  //Invalid
    return 0;
}

Инкапсуляция

Процесс сокрытия «конфиденциальных данных» от пользователей для доступа к ним называется инкапсуляцией. Для этого члены данных должны быть объявлены как частные. Если вы хотите разрешить пользователям изменять или получать доступ к этим элементам данных, вы можете добиться этого, предоставив общедоступные методы получения и установки.

class Employee {
  private:
    int salary;     // private data member
  public:
    //Setter
    void setSalary(int s) {
        salary = s;
    }
    //Getter
    {
    int getSalary() {
        return salary;
    }
};
int main() {
  Employee myObj;
  myObj.setSalary(50000);
  cout << myObj.getSalary();
  return 0;
}

В приведенном выше коде мы можем установить значение salary равным 50000 с помощью метода установки. Затем мы можем вывести значение зарплаты с помощью функции getter. Итак, здесь цель состоит в том, чтобы мы могли получить доступ к закрытым членам данных внутри класса, используя некоторые общедоступные функции.

Добытчик

По сути, геттер — это функция, которая используется для получения значения и отображения его пользователю.

Сеттер

Setter — это функция для присвоения или установки значений переменной, которая объявлена ​​как частная внутри класса.

Наследование

Наследование — это способность класса получать свойства и характеристики другого класса.

Синтаксис для наследования класса от его базового класса:

class subclass_name : access_mode base_class_name 
[
    //body of the subclass
}

Подкласс

Класс, который наследует свойства от другого класса

Супер Класс

Класс, свойства которого наследуются подклассом

//Base class or Parent class
class Vehicle {
    public:
        string brand = "Ford";
        void display() {
            cout << brand;
        }
};
//Derived class or child class
class Car : public Vehicle {
    public:
        string model = "Mustang";
    }
};
int main() {
    Car myCar;  // Object myCar is created for class Car
    myCar.display;
    cout << myCar.brand + " " + myCar.model;
    return 0;
}

В приведенном выше коде, хотя мы и не объявили строку brand в подклассе Car, мы можем получить доступ к атрибуту brand из его базового класса, поскольку он был унаследован в подкласс.

Способы наследования

Общественный

Если вы наследуете подкласс от общедоступного базового класса, тогда общедоступные атрибуты в базовом классе станут общедоступными , а защищенные атрибуты в базовом классе станет защищенным.

Защищено

Если подкласс является производным от защищенногобазового класса, то открытые и защищенные атрибуты станут защищенными в подклассе.

Частный

Если подкласс является производным от частногобазового класса, то общедоступные и защищенные атрибуты станут частными в подклассе.

Виды наследства

Единое наследство

Одиночное наследование — это производный подкласс только от одного базового класса.

Множественное наследование

Множественное наследование — это передача свойств более чем одного класса в подкласс.

Многоуровневое наследование

Этот тип наследования осуществляется путем наследования свойств производного класса или подкласса.

На приведенной выше диаграмме мы можем ясно понять, что класс C является производным от унаследованного класса «класс B». Следовательно, класс C также может получить доступ к атрибутам и свойствам класса A, поскольку класс B наследует свойства класса B.

Иерархическое наследование

При этом типе наследования от базового класса наследуется более одного подкласса.

Гибридное наследование

Гибридное наследование в основном реализует более одного типа наследования. Например: на следующей диаграмме реализованы Иерархическое и Множественное наследование.

Полиморфизм

Полиморфизм означает «множество форм» и возникает при наличии множества классов, связанных друг с другом путем наследования. То есть позволяет использовать одно действие по-разному.

Итак, это все об «объектно-ориентированном программировании». Я почти охватил основы ООП. Хотя я использовал C++ для примеров и фрагментов кода, то же самое применимо и к другим объектно-ориентированным языкам.

Удачного обучения!