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 第一種可...