前言
本系列文章承接C語言的學習,需要有C語言的基礎才能學會哦~
第7篇主要講的是有關于C++的取地址運算符重載、類型轉換、static成員和友元。
C++才起步,都很簡單
目錄
前言
取地址運算符重載
const成員函數
基本語法
特點
取地址運算符重載
類型轉換
static成員
友元
特點
取地址運算符重載
const成員函數
tips:const只有在修飾指向內容的時候,才設計權限的放大和縮小的問題。
基本語法
//無const,傳入參數為Date* const this,不可修改this指針本身
void Print()
{cout << _year << "-" << _month << "-" <<_day;
}//有const,傳入參數為const Date* const this,不可修改this指針和其指向的內容
void Print() const
{cout << _year << "-" << _month << "-" <<_day;
}
如上,const修飾后的成員函數Print,不可以在對類的任何成員進行修改
特點
①const修飾的成員函數,const放在參數列表后。
②const修飾后,成員函數不可以修改類對象的任何成員。
使用const,可以避免成員被意外修改,應加盡加
取地址運算符重載
對于自定義類型,只要是運算符,要使用必須先重載。
Date* operator&()
{return this;
}const Date* operator&() const
{return this;
}
為了避免權限問題,需要重載取Date*指針和const Date*指針。或者可以自定義返回一個任意地址(也可空指針),不過要當心出錯。
類型轉換
C++11,支持內置類型隱式類型轉化為自定義類型,但是需要有相關內置類型為參數的構造函數。
該隱式轉換過程中需要調用到構造函數。
//類A的構造函數
A(int a1)
:_aa1(a1)
{}//運行代碼
A aa1 = 1;
①語法上,先用常數1作為構造函數的參數,構造一個臨時對象,再用這個臨時對象拷貝構造為aa1。這里會出現連續的構造,而編譯器會將其優化為直接一次構造。
A& aa2 = 1;//不可行×
如上,要注意以1構造的臨時對象為const修飾,要注意權限問題。
const A& aa3 = 1;
②如果不想發生內置類型隱式轉換為自定義類型,則用關鍵字explicit。
③若A類型有多個內置類型成員(構造函數有多個參數),想用兩個或以上參數進行隱式轉換,需要用大括號和逗號表達。(如下)。
A aa3 = {1, 1}
static成員
①static修飾的成員變量,成為靜態成員變量,static變量必須要在類外初始化。(類里面聲明,類外初始化)
②static成員變量不屬于某個具體對象,存放在靜態區。
③static修飾的成員函數,稱之為靜態成員函數,static函數沒有this指針。
④static成員函數可以訪問靜態成員,但是不能訪問非靜態的成員,因為他沒有this指針,沒有隱藏的this指針
⑤不可以在聲明時給static成員變量缺省值。
⑥非靜態成員函數,可以訪問任意的靜態成員變量和靜態成員函數。
⑦同樣受訪問限定符限制
?
友元
提供了一種突破類訪問限定符的封裝來訪問的方式,在聲明前加friend修飾,友元分為友元函數、友元類。
特點
①友元函數可以訪問類的私有和保護成員,但他只是聲明,不是類的成員函數,而是外部函數。
②友元可以在類的任何位置聲明,不受訪問限定符的限制。
③一個類中,友元類的成員函數也是該類的友元函數。
④一個函數可以是多個類的友元函數。
⑤不具有交換性和傳遞性。比如,A是B的友元,但是B不是A的友元;A是B的友元,B是C的友元,但是A不是C的友元。
⑥友元會破壞封裝,所以不適宜多用。
?~~本文完結!!感謝觀看!!接下來更精彩!!歡迎來我博客做客~~?