Какие виды функций есть в C++, и как их различать?

В языке программирования C++ существует несколько видов функций, каждый из которых имеет свои особенности и возможности. Рассмотрим наиболее распространенные виды функций в C++ и способы их различения.

1. Глобальные функции:
- Определение: Глобальные функции являются частью глобальной области видимости и могут быть вызваны из любого места программы.
- Пример:

#include <iostream>

void helloWorld() {
    std::cout << "Hello, World!" << std::endl;
}

int main() {
    helloWorld(); // Вызов глобальной функции
    return 0;
}

2. Функции-члены класса:
- Определение: Функции-члены класса объявлены внутри определения класса и могут иметь доступ к его членам и переменным. Они могут быть вызваны через объект класса.
- Пример:

#include <iostream>

class MyClass {
public:
    void helloWorld() {
        std::cout << "Hello, World!" << std::endl;
    }
};

int main() {
    MyClass obj;
    obj.helloWorld(); // Вызов функции-члена класса
    return 0;
}

3. Статические функции:
- Определение: Статические функции являются частью класса, а не объекта класса. Они могут быть вызваны через имя класса без необходимости создания экземпляра класса.
- Пример:

#include <iostream>

class MyClass {
public:
    static void helloWorld() {
        std::cout << "Hello, World!" << std::endl;
    }
};

int main() {
    MyClass::helloWorld(); // Вызов статической функции
    return 0;
}

4. Виртуальные функции:
- Определение: Виртуальные функции объявлены в базовом классе и могут быть переопределены в производных классах. Позволяют достичь полиморфизма - вызов соответствующей функции в зависимости от типа объекта, через указатель или ссылку на базовый класс.
- Пример:

#include <iostream>

class Base {
public:
    virtual void helloWorld() {
        std::cout << "Hello, World! (Base)" << std::endl;
    }
};

class Derived : public Base {
public:
    void helloWorld() override {
        std::cout << "Hello, World! (Derived)" << std::endl;
    }
};

int main() {
    Base* obj1 = new Base();
    obj1->helloWorld(); // Вызов виртуальной функции из базового класса

    Base* obj2 = new Derived();
    obj2->helloWorld(); // Вызов виртуальной функции из производного класса

    delete obj1;
    delete obj2;
    
    return 0;
}

5. Лямбда-функции:
- Определение: Лямбда-функции являются анонимными функциями, которые могут быть определены внутри других функций или переданы в качестве аргументов другим функциям.
- Пример:

#include <iostream>

int main() {
    auto helloWorld = []() {
        std::cout << "Hello, World!" << std::endl;
    };

    helloWorld(); // Вызов лямбда-функции

    return 0;
}

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