const與指標型別

2021-07-11 03:11:27 字數 4212 閱讀 2984

const int *p = null;

int const *p = null;

//完全等價

int * const p = null

//和上面兩種情況不同

const int * const p = null;

int const * const p = null;

int x = 3;

const int *p = &x;

//p=&y; 正確

//*p = 4; 錯誤

//由於const修飾的是*p,而*p是具體的值而不是位址,所以這裡表示*p所指向的值是不可改變的。

int x = 3;

int *const p = &x;

//p = &y;錯誤的

//因為const修飾的是p,p是位址,因此位址p是不可改變的。

const int x = 3;

const int * const p = &x;

//都不能變。

const與引用

int x = 3;

const int &y = x;

//x = 10;正確

//y = 20;錯誤,不同通過y修改,但是能通過x修改。

對比例子:

const int x = 3;

int *y = &x;//編譯器報錯,可變指標不能指向不可變的變數。

int x = 3;

const int *y = &x;//允許。

巨集定義編譯器不檢查語法錯誤。

函式特性

函式預設值:

void fun(int i, int j = 5; int k = 10); //正確 func(20);func(20,30);fun(20,30,40);

void fun(int i, int j = 5;int k);//錯誤

有預設引數值的引數必須在參數列的最右端

函式過載

在相同的作用域內

用同乙個函式名定義多個不同的函式

引數個數和引數型別不同

在編譯過程,會這樣getmax_int_int;   getmax_double_double

內聯函式(關鍵字inline int getmax(int x, int y)):編譯時講函式體的**和實參代替函式的呼叫語句,優點是省去了呼叫過程,比較快,適合短迴圈

1:內聯編譯時建議性的,由編譯器決定

2:邏輯簡單,呼叫頻繁的函式建議用內聯

3:遞迴函式無法使用內聯,即使使用inline關鍵字,編譯器也將他看成普通函式

c++記憶體管理

本質是資源管理,由作業系統掌控。我們可以做的就是像作業系統申請資源和釋放資源

申請記憶體 new   釋放資源 delete   他們是運算子,而不是函式

int *p = new int; //申請單個記憶體

int *p1 = new int[10]; //申請一塊記憶體

delete p;

delete p1;

c語言中;void *malloc(size_t size);  void free(void *memblock);

注意會申請失敗。用if(p ==null)申請失敗。

釋放記憶體時,在delete p;後,要設定p=null; 否則會有亂七八糟的錯誤

c++記憶體分配:

補充在這裡。

結構體:

區別:c 結構體,就是資料的集合,只有成員變數,沒有方法。

c++ 結構體和 c++ 類基本一樣,可以有成員變數,有方法, 唯一區別就是結構體成員預設訪問控制為public,類為private

結構是一種用關鍵字struct宣告的自定義資料型別。與類相似,也可以包含建構函式,常數,字段,方法,屬性,索引器,運算子和巢狀型別等,不過,結構是值型別。

1.結構的建構函式和類的建構函式不同。

a.結構不能包含顯式的無引數建構函式。結構成員將自動初始化為它們的預設值。

b.結構不能包含以下形式的初始值設定類:base(argument-list);

2.對於結構中的例項字段成員,不能在宣告時賦值初始化。

3.宣告了結構型別後,可以使用new運算子建立構造物件,也可以不使用new關鍵字。如果不使用new,那麼在初始化所有字段之前,欄位將保持未賦值狀態且物件不可用。

5.什麼時候用結構呢?結構使用簡單,並且很有用,但是要牢記:結構在堆疊中建立,是值型別,而類是引用型別。每當需要一種經常使用的型別,而且大多數情況下該型別只是一些資料時,使用結構能比使用類獲得更佳效能。

結構是值型別,所以會影響效能,但根據使用結構的方式,這種影響可能是正面的,也可能是負面的。正面的影響是為結構分配記憶體時,速度非常快,因為它們將內聯或者儲存在堆疊中。在結構超出了作用域被刪除時,速度也很快。另一方面,只要把結構作為引數來傳遞或者把乙個結構賦給另乙個結構(例如a=b,其中a和 b是結構),結構的所有內容就被複製,而對於類,則只複製引用。這樣,就會有效能損失,根據結構的大小,效能損失也不同。注意,結構主要用於小的資料結 構。但當把結構作為引數傳遞給方法時,就應把它作為ref引數傳遞,以避免效能損失——此時只傳遞了結構在記憶體中的位址,這樣傳遞速度就與在類中的傳遞速 度一樣快了。另一方面,如果這樣做,就必須注意被呼叫的方法可以改變結構的值。

還有一點:struct 與class本質上應該是相同的,只是預設的訪問許可權不同(struct預設是public,class預設是private ).之所以要保留struct,很大一部分原因是為了與c相容吧(c++的一篇文章中是這麼說的,我感覺還是有一定的道理). class感覺是應該是struct的擴充,除了可以設定成員的訪問型別外,還可以有自己的成員函式,可以繼承派生等,好象struct能做的class 都能做,但反過來就不行了,如果沒有保護資料的要求,struct能做的我都用struct做,比較簡單。

c++ 封裝

建構函式,析構函式, this指標

類的定義:資料成員,成員函式

累的訪問限定符:public, private, protected

從棧中例項化物件,tv tv; tv tv[20];

從堆中例項化物件, tv *p = new tv(); tv *q = new tv[20];

delete p; delete q;

在棧中定義好物件後用點 tv.type=0; tv.changevol();

在堆中定義好物件後用-> : p-type=0; p->changevol();

p[i]->type = 0;

基本的資料型別:

字串陣列,用的比較頻繁

#includestring s1;

string s2("abc");

string s3(s2);

string s4(n,'c);

s.empty();

s.size();

s[n];

s1+s2;

s1 = s2;

v1 == v2;

v1 != v2;

stirng s6 = "hello" + "world" //錯誤,只能是變數+變數 或者 變數+「dd」

內類定義:內聯函式

class a

}

優先將其編譯成內聯函式。

類外定義:

同檔案類外定義,分檔案類外定義

同檔案類外定義:

class car;

void car::run(){}

分檔案類外定義:

class car

include "car.h"

void car::run(){}

#include<>直接從編譯器自帶的函式庫中尋找檔案

#include""是先從自定義的檔案中找 ,如果找不到在從函式庫中尋找檔案

如果是自己寫的標頭檔案 建議使用#include「」

類的初始化:

類的資料成員存放在棧或者堆中,而方法只存乙份,放在**區

建構函式:物件建立後自動呼叫,且只呼叫一次,

1:自動呼叫

2:建構函式與類同名

3:沒有返回值

4:可以過載

5:例項化物件僅用到乙個

6:當使用者沒有定義建構函式使,編譯器自動生成。

const與指標,const與函式

const與指標 常量指標 指向常量的指標 int b 500 1 const int a b 2 int const a b 以上中 a不允許改變,指標a可變 指標常量 指標本身是常量 3 int const a b 指標a不允許改變,a可改變 常量指標常量 4 const int const a...

const 指標與指向const的指標

當使用帶有const的指標時其實有兩種意思。一種指的是你不能修改指標本身的內容,另一種指的是你不能修改指標指向的內容。聽起來有點混淆一會放個例子上來就明白了。先說指向const的指標,它的意思是指標指向的內容是不能被修改的。它有兩種寫法。const int p 推薦 int const p 第一種可...

const 指標與指向const的指標

當使用帶有const的指標時其實有兩種意思。一種指的是你不能修改指標本身的內容,另一種指的是你不能修改指標指向的內容。聽起來有點混淆一會放個例子上來就明白了。先說指向const的指標,它的意思是指標指向的內容是不能被修改的。它有兩種寫法。const int p 推薦 int const p 第一種可...