Come mostrato nel codice sopra, senza ulteriori studi sul C++, gli utenti penseranno solitamente che il codice nel costruttore sia l'inizializzazione delle variabili membro della classe, ma il fatto è esattamente il contrario. In C++, l'istruzione principale del costruttore si limita a inizializzare le variabili membro non possono essere chiamate inizializzazione nel vero senso della parola, perché l'inizializzazione può essere inizializzata solo una volta, mentre il costruttore può assegnare valori alle variabili membro più volte, ad esempio:
In questo momento viene introdotto l'elenco di inizializzazione in C++. L'elenco di inizializzazione è un elenco di membri dati che iniziano con ":" (due punti) e separati da "," (virgola). Ciascuna variabile membro è seguita da una parentesi e il valore inserito tra parentesi è, ad esempio, il valore inizializzato :
Ciascuna variabile membro può essere visualizzata solo una volta nell'elenco di inizializzazione (l'inizializzazione può essere inizializzata solo una volta)
La classe contiene i seguenti membri, che devono essere inseriti nell'elenco di inizializzazione per l'inizializzazione:
Variabili membro di riferimento
Variabili membro di tipo personalizzato (e il tipo personalizzato non ha un costruttore predefinito: un costruttore senza parametri, un costruttore completamente predefinito, un costruttore generato automaticamente dal sistema)
const variabili membro modificate
Le variabili membro personalizzate menzionate sopra (senza costruttore predefinito) significano che il costruttore della variabile membro personalizzata definita è un costruttore con parametri e i parametri devono essere passati prima che possa essere inizializzato quando l'utente implementa esplicitamente il costruttore, se If the L'elenco di inizializzazione non viene scritto, il compilatore lo genererà automaticamente per l'utente. Tuttavia, se l'inizializzazione delle variabili membro personalizzate richiede la partecipazione di parametri, il sistema non passerà i parametri per impostazione predefinita, il che comporterà l'annullamento dell'inizializzazione devono evitare che si verifichi una situazione di non inizializzazione per evitare problemi inutili nell'uso successivo.
1.3 Suggerimenti sull'elenco di inizializzazione
Quando si scrive l'elenco di inizializzazione, l'ordine di inizializzazione delle variabili membro deve essere coerente con l'ordine di dichiarazione nella classe, poiché il compilatore inizializza le variabili in sequenza in base all'ordine di dichiarazione. Se l'utente non scrive nell'ordine, causerà problemi inutili, come:
Se inizializzato come mostrato nella figura sopra, si otterranno risultati incoerenti con le aspettative, quindi tali operazioni devono essere evitate quando lo si utilizza.
2. parola chiave esplicita
Per il costruttore esiste anche una funzione dedicata acostruttore a parametro singoloOCostruttore con più parametri ma nessun valore predefinito per il primo parametroConversione implicita del tipo, ad esempio:
A livello di compilatore, 2024 non viene assegnato direttamente all'oggetto classe creato, ma 2024 viene convertito in un oggetto classe temporaneo tramite conversione implicita e quindi assegnato all'oggetto classe che deve essere inizializzato tramite tale oggetto è necessario L'oggetto della classe inizializzata è A e l'oggetto della classe temporanea è B:
Date A(2024);
等价于
Date A = B//B的值为2024
1
2
3
Per evitare la conversione implicita, C++ ha creato la parola chiave esplicita L'aggiunta di esplicitamente prima del costruttore può impedire la conversione implicita, ad esempio:
explicitDate(int year):_year(year){}
1
2
3
3. membri statici
3.1 concetto di membro statico
I membri della classe dichiarati come statici sono chiamati membri statici della classe. Le variabili membro modificate con static sono chiamate variabili membro statiche; le funzioni membro modificate con static sono chiamate funzioni membro statiche. Le variabili membro statiche devono essere inizializzate all'esterno della classe, ad esempio:
I membri statici sono condivisi da tutti gli oggetti della classe e non appartengono a un oggetto specifico. Sono archiviati nell'area statica.
Le variabili membro statiche devono essere definite all'esterno della classe. La parola chiave static non viene aggiunta durante la definizione, ma viene semplicemente dichiarata nella classe.
È possibile accedere ai membri statici della classe utilizzando nome classe::membro statico o membro oggetto.static
Le funzioni membro statiche non hanno questo puntatore nascosto e non possono accedere a nessun membro non statico.
I membri statici sono anche membri della classe e sono limitati dai qualificatori di accesso pubblico, protetto e privato.
4. Youyuan
Gli amici forniscono un modo per superare l'incapsulamento e talvolta forniscono comodità. Tuttavia, gli amici aumenteranno l'accoppiamento e distruggeranno l'incapsulamento, quindi gli amici non dovrebbero essere usati più di una volta.
Gli amici sono divisi in: funzioni amico e classi amico
4.1 Funzioni amico
Una funzione amico significa che quando una funzione esterna alla classe deve accedere a un membro privato della classe, è possibile accedervi dichiarando questa funzione nella classe come funzione amico della classe, ad esempio:
Le funzioni Friend possono accedere ai membri privati e protetti di una classe, ma non alle funzioni membro della classe
Le funzioni Friend non possono essere modificate con const
Le funzioni Friend possono essere dichiarate ovunque nella definizione di classe e non sono limitate dai qualificatori di accesso alla classe.
Una funzione può essere una funzione amico di più classi
Il principio di chiamata delle funzioni Friend è lo stesso delle funzioni ordinarie.
4.2 Classi di amici
Quando una classe vuole accedere ai membri privati di un'altra classe, può dichiarare questa classe come amica nella classe a cui si desidera accedere, e quindi può accedere ai suoi membri privati, ad esempio:
classTime{friendclassDate;// 声明日期类为时间类的友元类,则在日期类中就直接访问Time类//中的私有成员变量public:Time(int hour =0,int minute =0,int second =0):_hour(hour),_minute(minute),_second(second){}private:int _hour;int _minute;int _second;};classDate{public:Date(int year =1900,int month =1,int day =1):_year(year),_month(month),_day(day){}voidSetTimeOfDate(int hour,int minute,int second){// 直接访问时间类私有的成员变量
_t._hour = hour;
_t._minute = minute;
_t._second = second;}private:int _year;int _month;int _day;
Time _t;};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
Le relazioni di amicizia sono unidirezionali e non commutative. Ad esempio, nelle classi Time e Date sopra menzionate, se dichiari la classe Date come classe amica nella classe Time, puoi accedere direttamente alle variabili membro private della classe Time nella classe Date, ma vuoi accedere alle variabili membro private della classe Date nella classe Time No.
La relazione di amicizia non può essere transitiva. Se C è amico di B e B è amico di A, non può significare che C sia amico di A.
5. Classe interna
C++ supporta la creazione di un'altra classe all'interno di una classe, denominata classe interna. La classe interna è una classe indipendente non appartiene alla classe esterna e non è possibile accedere ai membri della classe interna tramite gli oggetti della classe esterna . La classe esterna non ha alcun accesso superiore alla classe interna. E la classe interna è naturalmente amica della classe esterna, cioè la classe interna può accedere ai membri privati della classe esterna.
caratteristica:
Le classi interne possono essere definite come pubbliche, protette o private nelle classi esterne.
Si noti che le classi interne possono accedere direttamente ai membri statici delle classi esterne senza richiedere il nome dell'oggetto/classe della classe esterna.
sizeof(external class)=classe esterna, non ha nulla a che fare con le classi interne.
6. Conclusione
Grazie mille per aver visualizzato il mio articolo originale. Questo articolo viene utilizzato principalmente per l'apprendimento personale e la condivisione delle conoscenze. Il percorso di apprendimento è lungo. Se ci sono errori, grazie per avermi corretto. Se è necessario citare indicare l'indirizzo.