初識C 以及C 對C的加強

2021-10-13 11:58:50 字數 4815 閱讀 4586

2 初識c++

3 c++對c語言增強以及擴充套件

4 const 鏈結屬性

5 const 分配記憶體情況

6 物件導向和面向過程

7 擴充套件閱讀

1. 物件導向

2. 泛型程式設計

ansi在1998制定出c++第一套標準(c++98)

封裝、繼承、多型

#include

// 標準輸入輸出流

using

namespace std;

// 標準命名空間

::

// 雙冒作用域運算子

std::cout;

// std作用域下的cout

::a;

// ::前面什麼都不新增 代表全域性作用域

命名空間的用途?

解決名稱衝突問題

命名空間下可以存放什麼?

變數、函式、結構體、類…

命名空間必須要宣告在全域性作用域

命名空間可以巢狀命名空

namespace a

}int a = a::a_;

// 命名空間a下的a_

int a = a::b::a_;

// 命名空間a中命名空間b下的a_

命名空間是開放的,可以隨時將新成員新增到命名空間下

namespace a

namespace b

namespace a

// 相當於

namespace a

;namespae b

命名空間可以匿名的

namespace

// 相當於全域性變數,直接使用

cout <<

"a_ = "

<< a_ <<

" b_ = "

<< b_ << endl;

命名空間可以起別名

namespace longname

void

test()

1.using 命名空間名::成員名;

2.當使用using宣告去宣告了乙個命名空間中的變數,在函式中有乙個相同的變數名,會報錯,盡量避免

namesapce person

void

test()

1.using namespace 命名空間名;

2.當using編譯指令 與 就近原則同時出現,優先使用就近原則

3.當using編譯指令有多個,需要加作用域 區分

namespace person

namespace dog

// 第一種情況

void

test1()

// 第二種情況

void

test2()

int a;

int a =10;

// 在c語言中,可以這樣使用,相當於賦值 int a; a = 10;

// 在c++語言中,編譯錯誤

c語言:返回值沒有檢測 形參型別沒有檢測 函式呼叫引數個數沒有檢測

c++語言:返回值檢測、形參型別檢測、函式呼叫引數個數

// 在c語言中

// 1 函式的返回值沒有檢測

// 2 形參型別沒有檢測

// 3 函式呼叫引數個數沒有檢測

getrects

( w , h)

void

test()

c語言:char * p = malloc(64);

c++語言:char * p = (char *)malloc(64);

// malloc返回型別為void*,在c語言中可以這樣使用

void

test()

// 在c++語言中必須強轉

void

test()

c語言:結構體中不可以有函式,建立結構體變數不可以簡化struct

c++語言:結構體中可以有函式,建立結構體變數可以簡化struct

struct person

;// 1.c++可以在結構體中放函式

// 2.建立結構體變數,可以簡化關鍵字struct

void

test()

c++才有bool型別

// c++才有bool型別

// 代表真 --- 1 true 假 ---- 0 false

bool flag;

// true/false

c語言:返回的是值,只能做左值

c++語言:返回的是變數,可以做左值,也可以做右值

int a =10;

int b =20;

int c;

//c語言下返回的是值,只能做左值

c = a > b ? a : b;

// c = 20

// a > b ? a : b = 100 相當於 20 = 100; 錯誤

*(a > b ?

&a :

&b)=

100;

// b = 100

//c++語言下返回的是變數,可以做左值,也可以做右值

a > b ? a : b =

100;

// 返回b, b = 100;

c語言:

全域性 const 直接修改->失敗 ,間接修改(通過指標) ->語法通過,執行失敗

區域性 const 直接修改 ->失敗 ,間接修改(通過指標)-> 成功

int arr[a]; 在c語言下 const是偽常量,不可以初始化陣列

c++語言:

全域性 const 和c結論一樣

區域性 const 直接修改->失敗 ,間接修改(通過指標)-> 失敗

int arr[b]; c++中const可以稱為常量,可以初始化陣列

// c語言下

// 全域性const 直接修改 失敗 間接修改(通過指標) 語法通過,執行失敗

// 區域性 const 直接修改 失敗 間接修改(通過指標) 成功

// int arr[a]; 在c語言下 const是偽常量,不可以初始化陣列

const

int a =20;

// 全域性

void

test1()

// c++語言下

// 全域性 const 和c結論一樣

// 區域性 const 直接修改失敗 間接修改(通過指標) 失敗

// c++中const可以稱為常量,可以初始化陣列

const

int c =20;

// 全域性

void

test2()

c語言下 const修飾的全域性變數預設是外部鏈結屬性

c++下 const修飾的全域性變數預設是內部鏈結屬性,可以加extern 提高作用域

// test.cpp 檔案

// c語言中

const

int g_a =

100;

// c++語言中

extern

const

int g_b =

100;

//預設是內部鏈結屬性 可以加關鍵字 extern 提高作用域

// 使用全域性變數g_a,c和c++一樣

void

test()

對const變數取位址 ,會分配臨時記憶體

使用普通變數來初始化const變數,棧記憶體(可通過間接方式修改const變數)

對於自定義資料型別,棧記憶體(可通過間接方式修改const變數)

//1、對const變數取位址,會分配臨時記憶體  

void

test01()

//2、使用普通變數來初始化const變數

void

test02()

//3、對於自定義資料型別

struct person

;void

test03()

物件導向:  狗.吃(**) 

面向過程:  吃(狗,**)

盡量用const代替define

define出的巨集常量,沒有資料型別、不重視作用域(不進行編譯,在預處理階段展開)

#difine flag 10

// 用const代替define

const

int flag =

10;

C 對C的加強

c 是c語言的繼承,它既可以進行c語言的過程化程式設計,又可以進行以抽象資料型別為特點的基於物件的程式設計,還可以進行以繼承和多型為特點的物件導向的程式設計。c 擅長物件導向程式設計的同時,還可以進行基於過程的程式設計,因而c 就適應的問題規模而論,大小由之。c 不僅擁有計算機高效執行的實用性特徵,...

C 對C的加強

c 是c語言的繼承,它既可以進行c語言的過程化程式設計,又可以進行以抽象資料型別為特點的基於物件的程式設計,還可以進行以繼承和多型為特點的物件導向的程式設計。c 擅長物件導向程式設計的同時,還可以進行基於過程的程式設計,因而c 就適應的問題規模而論,大小由之。c 不僅擁有計算機高效執行的實用性特徵,...

c 對c的加強

1.register關鍵字的加強 register修飾符暗示編譯程式相應的變數將被頻繁地使用,如果可能的話,應將其儲存在cpu的暫存器中,以加快其儲存速度,這只是一種請求,編譯器可以拒絕這種申請。1 register變數必須是能被cpu所接受的型別。這通常意味著register變數必須是乙個單個的值...