Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

[C++] Wykonanie kodu przed wywołaniem funkcji main - ciekawostka


Rekomendowane odpowiedzi

Opublikowano

Pewnie jak uczyliście się programowania w C++ to pierwszą rzeczą, którą was nauczono było to, że program zaczyna się wykonywać od funkcji main, czyli po jego włączeniu będzie to pierwsza zrobiona rzecz (pomijając, że wcześniej są funkcje wygenerowane przez kompilator, które przygotowują środowisko do pracy a na koniec dopiero one wywołują main).

 

Więc teoretycznie nie powinno się dać zrobić nic zanim main nie zostanie wywołany, prawda? Otóż nie ;) Właściwie można wykonać cały program zanim zacznie się funkcja main.


#include <iostream>
#include <string>


class App {
public:
    App() {
        run();
        
    }
    
    void run() {
        std::cout << "Wpisz imie: ";
        
        std::string name;
        std::cin >> name;
        
        std::cout << "Żegnaj " << name << std::endl;
    }
} app;


int main() {
    
    return 0;
}



Ponieważ zmienna App app jest zmienną globalną zostanie zainicjalizowana na samym początku, czyli zostanie wywołany jej konstruktor, który z kolei wywołuje funkcję run(). Jest to kod całkowicie zgodny ze standardem języka, natomiast traktowałbym to jako ciekawostkę i nie stosował w swoich programach takiego rozwiązania bo może być to dość nieintuicyjne. 

RAsfepN.png
Opublikowano

Ponieważ zmienna App app jest zmienną globalną zostanie zainicjalizowana na samym początku, czyli zostanie wywołany jej konstruktor, który z kolei wywołuje funkcję run(). Jest to kod całkowicie zgodny ze standardem języka, natomiast traktowałbym to jako ciekawostkę i nie stosował w swoich programach takiego rozwiązania bo może być to dość nieintuicyjne.

 

Nie tyle nieintuicyine, a w niektórych przypadkach niepożądane czy wręcz niebezpieczne, gdzie funkcja, obiekt bądź metoda wywoływana w konstruktorze może nie być zainicjowana, gdyż jej inicjacja jest gdzieś w funkcji głównej. Dlatego trzymałbym się od takiego wywołania z daleka, chyba że ma to jakieś wytłumaczenie, na przykład obiekt mierzący czas działania programu między konstrukcją a destrukcją.

 

A propos destrukcji zapomniałeś wspomnieć, że działa to też z drugiej strony: funkcja może być wywoływana także PO zakończeniu funkcji main:

#include <iostream>
#include <string>
 
using namespace std;
class App {
public:
    App() {
        run();
 
    }
    ~App(){
    	quit();
    }
 
    void quit(){
    	cout<<"quit()"<<endl;
    }
 
    void run() {
    	cout<<"run()"<<endl;
    }
} app;
 
 
int main() {
    cout<<"main"<<endl;
    return 0;
}

To też taka ciekawostka ;)


Pomagam w projektach dotyczących programowania (C++/C/Java/C#/inne). Jak masz jakiś problem, napisz do mnie, wspólnie poszukamy rozwiązania ;).

Opublikowano

To jest właśnie jeden z powodów dlaczego odradza się używania globalnych obiektów, na rzecz np. singletonów których instancja zostanie stworzona przy pierwszym odwołaniu się do nich.

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...