學習筆記2 轉換運算子

2021-08-26 05:26:11 字數 3289 閱讀 7703

c++ 關鍵字

下表列出了 c++ 中的保留字。這些保留字不能作為常量名、變數名或其他識別符號名稱。

asm(嵌入彙編**) else new(分配記憶體) this(this 是const指標,要用-)

auto(auto用於修飾乙個自動變數) enum(列舉) operator (過載操作符) throw(丟擲異常throw(……)表示拋棄所有)bool explicit(顯示的明顯的) implicit(隱式的) private true(私有的不能繼承)break(截斷多於switch()合用) export(匯出/出口/輸出,一般針對模板類) protected(保護的) try case extern(匯出/出口/輸出,一般的物件的變數等) public(公共的) typedef (重新定義型別)

catch(捕獲並處理異常) false register(修飾符使變數在暫存器中,提高編譯速度) typeid(:typeid是操作符判定資料型別,返回typeinfo())

char float reinterpret_cast(重新定義,型別轉換) typename(型別名稱)

class for return union

const friend short unsigned(無符號)

const_cast**換運算子) goto signed using

continue if sizeof (sizeof是乙個操作符(operator)不是函式,返回位元組數) virtual(虛構,虛繼承和虛析構是很好的習慣 可以避免許多的問題。)

default (預設,) inline static(靜態變數儲存) void

delete(刪除) int static_cast(靜態型別轉換) volatile(直接訪問原始記憶體位址)

do long struct(結構體) wchar_t(寬字元unicode支付表,char ansi編碼)

double mutable(multable的英文意思主要是可變的,來修改常函式) switch(switch語句是一種多路判定語句) while

dynamic_cast(動態型別轉換) namespace(命令空間) template (模板)

前面講了c++繼承並擴充套件c語言的傳統型別轉換方式,最後留下了一些關於指標和引用上的轉換問題,沒有做詳細地講述。c++相比於c是一門物件導向的語言,物件導向最大的特點之一就是具有「多型性(polymorphism)」。

要想很好的使用多型性,就免不了要使用指標和引用,也免不了會碰到轉換的問題,所以在這一篇,就把導師講的以及在網上反覆查閱了解的知識總結一下。

c++提供了四個轉換運算子:

const_cast (expression)

static_cast (expression)

reinterpret_cast (expression)

dynamic_cast (expression)

它們有著相同的結構,看起來像是模板方法。這些方法就是提供給開發者用來進行指標和引用的轉換的。

其實我很早就想寫這篇內容的,自己不斷地檢視導師發來的資料,也在網上不停地看相關的知識,卻一直遲遲不能完全理解c++轉換運算子的用法,倒是看了那些資料後先寫了一篇傳統轉換方面的內容。雖然從字面上很好理解它們大致是什麼作用,但是真正像使用起來,卻用不知道他們具體的用途,只會不斷的被編譯器提醒error。所以如果出現理解不到位或錯誤的地方,還希望前人或來者能夠指正。

在我看來這些標準運算子的作用就是對傳統運算子的代替,以便做到統一。就像我們用std::endl來輸出換行,而不是』\n』。我會用**來說明相應的傳統轉換可以如何這些標準運算子。當然,這這是大致的理解,在標準運算子上,編譯器肯定有做更多的處理,特別是dynamic_cast是不能用傳統轉換方式來完全實現的。

在這一篇文章裡,我會先講講我對const_cast運算子的理解。

const_cast (expression)

const_cast轉換符是用來移除變數的const或volatile限定符。對於後者,我不是太清楚,因為它涉及到了多執行緒的設計,而我在這方面沒有什麼了解。所以我只來說const方面的內容。

用const_cast來去除const限定

對於const變數,我們不能修改它的值,這是這個限定符最直接的表現。但是我們就是想違背它的限定希望修改其內容怎麼辦呢?

下邊的**顯然是達不到目的的: const int constant = 10;

int modifier = constant;

因為對modifier的修改並不會影響到constant,這暗示了一點:const_cast轉換符也不該用在物件資料上,因為這樣的轉換得到的兩個變數/物件並沒有相關性。

只有用指標或者引用,讓變數指向同乙個位址才是解決方案,可惜下邊的**在c++中也是編譯不過的: const int constant = 21;

int* modifier = &constant

// error: invalid conversion from 『const int*』 to 『int*』

(上邊的**在c中是可以編譯的,最多會得到乙個warning,所在在c中上一步就可以開始對constant裡面的資料胡作非為了)

把constant交給非const的引用也是不行的。 const int constant = 21;

int& modifier = constant;

// error: invalid initialization of reference of type 『int&』 from expression of type 『const int』

於是const_cast就出來消滅const,以求引起程式世界的混亂。

下邊的**就順利編譯功過了: const int constant = 21;

const int* const_p = &constant;

int* modifier = const_cast

using namespace std;

void printer (int* val,string seperator = 「\n」)

int main(void)

{ const int consatant = 20;

//printer(consatant);//error: invalid conversion from 『int』 to 『int*』

printer(const_cast

using namespace std;

int main(void) {

int variable = 21;

int* const_p = &variable;

int* modifier = const_cast

C 運算子過載 6 轉換操作符

c 利用類做為具體型別來抽象現實世界。有時需要隱式地將乙個具體型別轉換為另乙個具體型別,或轉換為原始型別。此時就需要用到轉換操作符。include include using namespace std class complex 求複數的絕對值 double mag 轉換操作符 operator ...

學習筆記(2) 邏輯運算子和位運算子

public class demo1 結果如下 a b false a b true a false 短路運算 和 的短路運算,是指如果前面的判斷條件已經明確結果則不執行後面的判斷 例如 public class demo1 結果如下 b false a 10 c true a 9 當判斷到 a 9...

運算子 轉換

1.算數運算子 l 自身加一 有前加和後加 l 自身減一 有前減和後減 l 前加加 先加一再運算 l 後加加 先取原值,運算後在加1 l 前減減 先自身減1再運算 l 後減減 先取原值運算後再減一 例 int num 10 l int number 10 num 先取原值,參與運算最後在加1。例如 ...