B var3 (var1); // B (A)
C var4 (var3); // C (B)
C var5 (var1); // C (B (A))
C var6 (5.6); // Eroare! C (B (A (dublu)) este implicit numit)
C var7 (A (5.6)); // C (B (A))
Eroarea în crearea variabilei var6 se datorează faptului că aveți nevoie de două nivele de transformări implicite non-standard care sunt executate prin apelarea constructorilor: dublu la A și apoi A la B.
Când creați var7, una dintre aceste conversii - dublu la A - este explicită, iar acum totul va fi bine.
Astfel, un constructor cu un argument, Class :: Class (type), definește întotdeauna o conversie de tip la un tip de clasă și nu doar o modalitate de a crea un obiect prin accesarea explicită a acestuia.
Pentru a converti un tip abstract la un tip standard sau un tip abstract la un tip abstract în C ++, există un instrument, o funcție care efectuează conversia de tip sau un operator de conversie de tip.
Clasă :: tip operator (vid);
operator dublu ()
// tip abstract de la standard.
dublu d1 = dublu (i); // conversie explicită de tip int în dublu;
dublu d2 = i; // conversia implicită a int în dublu;
dublu d3 = dublu (xv); // convertire explicită a tipului X la dublu;
dublă d4 = xv; // conversia implicită a lui X pentru a dubla.
// Convertiți un tip abstract la un tip abstract.
char * str1; // Strings str1 și str2 stochează caracterul
char * str2; // reprezentarea numerelor întregi.
Y (char * s1, char * s2): str1 (s1), str2 (s2)<>
Yvar ("12", "- 25");
Când creați o variabilă xvar, înainte de a apela constructorul de copiere X :: X (X), veți converti implicit valoarea variabilei yvar la tipul X. Aceeași conversie ar putea arăta astfel:
X xvar = X ("12", "-25");
compilatorul va afișa un mesaj de eroare "constructorul cu argumentele specificate nu a putut fi găsit". Faptul este că, spre deosebire de constructor, funcția operator-operație a conversiei de tip nu poate crea un obiect de tip abstract. Este posibilă numai conversia valorii unui obiect deja creat de același tip la o valoare de alt tip. În ultimul exemplu, un obiect de tip Y nu există încă.
Modelul de familie de clasă definește modul în care sunt construite clasele individuale, similar cu modul în care clasa definește regulile de construcție și formatul obiectelor individuale. Modelul familiei de clasă este definit după cum urmează:
șablon <список параметров шаблона> clasă
În definiția clasei incluse în șablon, numele clasei joacă un rol special. Nu este numele unei clase speciale, ci un nume parametrizat pentru familia de clase.
Definiția unui șablon poate fi globală.
Să considerăm un vector de clasă în care numărul de date intră într-o matrice unidimensională. Indiferent de tipul elementelor din această matrice, aceleași operațiuni de bază trebuie să fie definite în clasă, de exemplu, accesul la element prin index și așa mai departe. Dacă tipul de elemente vectoriale este setat ca parametru de șablon de clasă, sistemul va genera vectorul de tipul dorit și clasa corespunzătoare pentru fiecare definiție a unui anumit obiect.
șablon
T * pv; // matricea unidimensională;
int dimensiune; // dimensiunea matricei.