void în C++

Înseamnă „niciun tip”: o funcție void nu returnează nimic, iar void* este un pointer către date de orice tip.

Sintaxă
void functie();     // funcția nu returnează nimic
void* p;            // pointer către orice tip

Ce face void

Cea mai des întâlnită folosire: tipul returnat al funcțiilor care fac ceva, dar nu calculează o valoare (afișează, salvează, modifică). Într-o funcție void poți scrie return; fără valoare, ca să ieși mai devreme.

void* este un pointer „generic”: ține o adresă, dar nu știe ce tip de date se află acolo. Trebuie transformat înapoi în tipul corect (cu static_cast) înainte de folosire. Este des întâlnit în bibliotecile C (malloc, memcpy); în C++ modern se folosesc rar.

Expresia (void)x; sau static_cast<void>(x) spune explicit „știu că nu folosesc valoarea”, ca să nu primești avertismente.

Exemple

Exemplul 1: Funcție care nu returnează nimic

#include <print>
#include <string>

void saluta(const std::string& nume) {
    if (nume.empty()) {
        std::println("Nu știu pe cine să salut.");
        return;  // ieșire devreme, fără valoare
    }
    std::println("Bună, {}!", nume);
}

int main() {
    saluta("Ana");
    saluta("");
}

Rezultat

Bună, Ana!
Nu știu pe cine să salut.

Exemplul 2: void* și transformarea înapoi

Funcția primește adresa ca void*, deci nu știe ce e acolo. Cel care o apelează știe că e un int și face conversia înapoi.

#include <print>

void afiseaza_int(void* date) {
    int* numar = static_cast<int*>(date);
    std::println("Valoarea: {}", *numar);
}

int main() {
    int nota = 9;
    afiseaza_int(&nota);
}

Rezultat

Valoarea: 9

Greșeli frecvente

  • Încerci să citești printr-un void* direct: *p. Nu se compilează, pentru că nu se știe ce tip are valoarea; transformă-l întâi în pointerul corect.
  • Folosești rezultatul unei funcții void: int x = saluta("Ana");. Funcția nu returnează nimic, deci primești eroare de compilare.

Comenzi înrudite

  • return: Încheie funcția curentă și trimite, opțional, o valoare înapoi celui care a apelat-o.
  • pointeri (*, &): Un pointer este o variabilă care ține adresa altei variabile; prin el poți citi și modifica valoarea de la acea adresă.
  • static_cast, dynamic_cast, const_cast, reinterpret_cast: Cele patru conversii explicite: static_cast (obișnuite), dynamic_cast (clase), const_cast (const) și reinterpret_cast (biți).