初識C 整理

2021-09-28 20:24:49 字數 3272 閱讀 7576

定義命名空間,需要使用到namespace關鍵字,後面跟命名空間的名字,然後接一對{}即可,{}中即為命名空間的成員。 如namespace n1

1.命名空間中的內容,既可以定義變數,也可以定義函式

2.命名空間可以巢狀

3.同乙個工程中允許存在多個相同名稱的命名空間編譯器最後會合成同乙個命名

空間中。

命名空間的使用有三種方式:

1.加命名空間名稱及作用域限定符

int

main()

2.使用using將命名空間中成員引入

using n::b;

intmain()

3.使用using namespace 命名空間名稱引入(不建議使用)

using namespce n;

intmain()

intmain()

// 注意:如果生命與定義位置同時出現,恰巧兩個位置提供的值不同,那編譯器就無法確定到底該用那個

預設值。

3. 預設值必須是常量或者全域性變數

引數的個數、引數的型別、引數的順序  不同(函式的返回型別不同也不可以)(在同乙個作用域下)(也就是如果乙個add函式在全域性,乙個在命名空間裡,這並沒有構成過載,用命名空間的add必須加網域名稱)。
為什麼c++可以過載而c語言卻不可以?

··c語言:不支援過載 --> 函式名修飾規則不支援 --> _ + 函式名 --> 相同的函式名無法區分

·· c++: 支援過載 --> 函式名修飾規則支援 --> 字首 + 函式名 + 引數資訊 --> 相同的函式名可以區分

extern 「c」 按c語言風格來編譯

引用在定義時必須初始化

乙個變數可以有多個引用

引用一旦引用乙個實體,再不能引用其他實體(類似於int* const a)

··引用:char& a = b

相當於 char* const a

底層實現上,引用通過指標實現(int*a 和 int&a 的彙編**是一樣的)

引用: a++ --> a = 2

指標:++ 是加位址

sizeof(a) = sizeof(char) 就看引用是什麼型別

常引用

void

testconstref()

引用和指標的區別

引用在定義時必須初始化,指標沒有要求

引用在初始化時引用乙個實體後,就不能再引用其他實體,而指標可以在任何時候指向任何乙個同型別

實體沒有null引用,但有null指標

引用自加即引用的實體增加1,指標自加即指標向後偏移乙個型別的大小

有多級指標,但是沒有多級引用

訪問實體方式不同,指標需要顯式解引用,引用編譯器自己處理

引用比指標使用起來相對更安全

函式傳引用比傳指標更快

·· 1.inline是一種以空間換時間的做法,省去呼叫函式額開銷。所以**很長或者有迴圈/遞迴的函式不適宜

使用作為內聯函式。

2. inline對於編譯器而言只是乙個建議,編譯器會自動優化,如果定義為inline的函式體內有迴圈/遞迴等

等,編譯器優化時會忽略掉內聯。

3. inline不建議宣告和定義分離,分離會導致鏈結錯誤。因為inline被展開,就沒有函式位址了,鏈結就會找不到。

4. 類似巨集替換,但是巨集替換沒有語法檢查,傳參的檢查,相對不安全

巨集的優缺點?

優點:1.增強**的復用性。

2.提高效能。

缺點:1.不方便除錯巨集。(因為預編譯階段進行了替換)

2.導致**可讀性差,可維護性差,容易誤用。

3.沒有型別安全的檢查 。

c++有哪些技術替代巨集?

常量定義 換用const

函式定義 換用內聯函式

·· auto 定義變數,必須初始化,變數的實際型別由初始化表示式確定

其中auto p = &a == auto* p = &a

而引用必須 auto& p = a; 不能auto p = a;

·· auto 不能作為函式的引數,不能直接用來宣告陣列

可以auto a = 1,b = 2. 但是a和b 的型別必須一致,auto是按照 定義的第乙個變數來確定型別

對於乙個有範圍的集合而言,由程式設計師來說明迴圈的範圍是多餘的,有時候還會容易犯錯誤。因此c++11中

引入了基於範圍的for迴圈。for迴圈後的括號由冒號「 :」分為兩部分:第一部分是範圍內用於迭代的變數,

第二部分則表示被迭代的範圍。

void

testfor()

;for

(auto

& e : array) e *=2

;for

(auto e : array)

cout << e <<

" ";

return0;

}

注意:與普通迴圈類似,可以用continue來結束本次迴圈,也可以用break來跳出整個迴圈。

範圍for的使用條件

for迴圈迭代的範圍必須是確定的

對於陣列而言,就是陣列中第乙個元素和最後乙個元素的範圍;對於類而言,應該提供begin和end的

方法,begin和end就是for迴圈迭代的範圍。

注意:以下**就有問題,因為for的範圍不確定

void

testfor

(int array)

在使用nullptr表示指標空值時,不需要包含標頭檔案,因為nullptr是c++11作為新關鍵字引入的。

在c++11中,sizeof(nullptr) 與 sizeof((void*)0)所佔的位元組數相同。

為了提高**的健壯性,在後續表示指標空值時建議最好使用nullptr。

·· c語言中 null 本質上是巨集替換 null == 0 , 也就是fun(int* a) 和 fun(int a) 呼叫時用fun(null)呼叫的是int 的,想呼叫int* 的就直接用fun((int*) null)

int* p = null == int* p = 0;

··c++中 fun(nullptr) 呼叫的是 fun(int* a)

C語言《前年筆記整理》(一)C語言初識

一些操作的說明 由於本屌是學iso出身,so我所學的c語言大多在mac系統裡敲 的。先介紹下mac的一些操作吧 一 mac系統使用 1.mac系統簡單介紹 mac 是一種類 unix 的圖形化介面作業系統,有兩種開發環境 圖形化 ide 和終端terminal。簡單的說就是蘋果開發的一套作業系統 2...

Hadoop整理一(初識Hadoop)

1.hadoop目的是讓多台計算機同時解決乙個問題 2.hdfs hadoop distributed file system 分布式儲存系統 是乙個分布式檔案系統,有目錄,目錄下可以儲存檔案 3.hdfs不適合儲存大量小檔案,不適合低延遲資料訪問,不支援多使用者寫入及任意修改檔案 4.使用者命令,...

初識等級保護,要點整理

一 什麼是等級保護 資訊保安等級保護是指對國家重要資訊 法人和其他組織及公民的專有資訊以及公開資訊和儲存 傳輸 處理這些資訊的資訊系統分等級實行安全保護,對資訊系統中使用的資訊保安產品實行按等級管理,對資訊系統中發生的資訊保安事件分等級響應 處置 二 等級保護步驟流程 一般分為五個標準步驟 定級 備...