【C++】01
前言
c語言是結構化語言,c++兼容c,但是c不兼容c++。
c語言注重實現邏輯,c++注重過程,整體設計。
c語言對于大項目不易于維護、擴展。
c++考慮整體優化和管理。
c++頭文件一般沒有擴展名,.h一般是c語言的,c開頭的是c++的。
c++標準函數庫和類庫的合體。
std是命名空間,所有組件的名字都存在std中,打開命名空間才可以使用形如cout等命令。
可以用std::cout<<這種方式,但是打開了namespace也就沒必要了。
c++組成:c語言+面向對象+泛型編程+STL標準模板庫。
面向對象三大特性:封裝、繼承、多態。
- 封裝:零散的數據和算法,放入一個集合,方便管理使用。
- 復用:功能體現在方法中,針對功能去設計。
- 擴展:新的功能不能影響原來的功能。
可以用模板類實現復用。
template<typename T> T add(T a,T b){return a+b; }可以對同一類型進行模板代用。
?解決方案中可以直接添加項目sln。但是只能同時調用一個,選為主要的。
debug調試信息都在,release沒有調試信息,更小一點。
因此除了調試信息的內容,剩下都必須留下。工程文件和cpp等都留下。
作用域
::表示作用域運算符。
<<輸出操作符,>>輸入操作符,endl有刷新緩存的用法,都是函數。
cout是一個ostream類的對象。
變量在程序中所起的作用范圍:全局、語句、局部,語句指的是臨時變量,一般沒用。
作用域優先級:范圍越小越優先。
作用域運算符作用:區分同名成員,例如cout<<::n,就是全局區的n變量,而不是局部的。
重定義:同一作用域不可能有兩個變量名重復。
可以劃分作用域,即可使用重名。
命名空間:組織和重用代碼編譯單元,解決重名現象。
using+空間名字,或空間名+作用域運算符。
命名空間目的:整體操作方便,實現:復用+擴展。
namespace AA{int a=10}也可以對空間內容直接顯示,using AA:a。
#ifdef#endif
#ifdef AA using namespace aa; #endif#ifdef BB using namespace bb; #endif#define AAcout<<a<<endl;此時的a就是aa空間里的a了。?
new/delete
new數組,int* arr=new int[10];delete[] arr;
new int[10](),就都是初始化空值。其中()不是初始化列表,{}才是。
注意數組的類型是int[10],并且delete時候也要表示出這個變量是數組。
arr=0,表示數組是空。因此可以用if(!arr)來作為條件判斷。
指針delete之后,一定要繼續p=0;依次來將指針所指賦空。理由是:避免內存泄漏。
new int(123),初始化地址中內容,是123。
指針數組,他是數組,但是里面都是指針,也就是說內容是,int*[],但是如果new的話,他要用的是首元素來接住,那么首元素就是int*,然后指針還要加一個*,就是int** p=new int*[];
數組指針,是一個數組的指針,new (int(*)[]),然后接的時候,應該就是整個數組,int(**p)[]。
二維數組元素都是一維數組,int(*p)[]=new int[][];
new申請類對象,會調用構造函數,而malloc不會。
重載
for基于數組有特殊用法,for(auto& x:arr),即可在不使用下標的情況下,直接遍歷數組,而其中的x表示每一個元素,依次進行賦值。
這里利用了引用,表示可以直接取值,在函數中用的頗為廣泛,也就是說,可以全部加上。
缺省函數參數,可以在函數中使用默認值,這樣,在調用的時候可以不用加入參數。
參數不可以傳一半,形參只能是從后往前進行傳默認值,而且函數調用時,不能是空參數。
同名函數不可以同時出現,但是,如果是參數不同的話,那可以。
這種同名函數之間的關系叫做:重載。
重載:當同一類功能的函數,只是部分細節不同,說的是參數類型和個數,利用“重載機制”可以將這些函數去程相同的名字,從而使程序易于閱讀和理解。
引用
引用:變量的別名。
類似于指針,兩個名字指向一個空間。引用定下來之后,就永遠是這里了。
引用好處:避免將整塊數據全部壓棧。提高程序效率。不會新申請空間。
返回值是引用的好處:不會產生返回值的副本。
方法:必須在定義的時候初始化,int& b=a;而且后面不能是常值,必須是變量。
常引用:const int& b=123;
與引用不同,后面就是常值。
void (p_fun)(int)=&show;
STL-string
bool值只占1字節,小寫true和false。
string是類,里面有很多的使用方法,如鏈接所示:【C++】STL-string
鏈接:【C++】STL-string_王向晚的博客-CSDN博客
字符串名字代表地址。
類與對象
面向過程:DS+算法。
面向對象:對象求和。而對象=數據+算法。
類:復雜數據類型。將不同類型的數據和相關操作封裝在一起的操作。
class的結尾有分號!
private一般是用于接口類中,不可訪問的成員。如果繼承可以用protected。
如果擁有接口,甚至可以修改private的內容。
類中的變量,不可以直接初始化。
類不占用空間,而對象占用。
類中不能裝自己類的對象。
顯示和賦值要分開。
接口:提高安全性,封裝復用。
構造、析構函數
與類同名,無返回值。
目的:給類成員初始化。定義對象的時候自動調用。
如果不寫構造或析構,系統會給一個。
但是構造可以有多個(是否有參),但是析構只能有一個。
析構:反向構造,釋放空間。由析構來完成內存回收。
作用域結束,調用析構,或者是對象生命周期結束。
類是數據與算法的集合。
析構函數出現在return 0之后。
雖說有析構函數,但是回收的也是類內的空間,但是如果你是new的對象,你要手動析構你自己創建的這個對象。
全局對象:整個應用程序,可以跨文件。跨文件用extern進行僅聲明。
靜態:程序創建開始,到程序結束。但是靜態,僅限在自己文件中使用。
但是如果是同文件之內,第一次創建之后,后面就不會創建了。
封裝
優點:可讀性強,便于修改維護,構造析構。
接口:當換了操作系統或者編譯環境時,無需修改。
設計原則——單一職責:職責越少,復用性越高。
因此要拆分函數,與此類無關的函數不能放入。
對象種類
全局對象生命周期:程序退出。
正常對象:return 0——析構——結束。
全局對象:return 0——結束}——析構。
new和delete觸發構造和析構。
堆區空間要手動釋放,以免內存泄漏。
this指針
空類占1B,起到占位作用。
空類+函數,也是1B。
但是有成員,例如一個int,就是4B了,而不是4+1B。
成員屬性:定義對象時分配空間,每一個對象都有一分。
成員函數:編譯期存在,在代碼區,所有對象共用一份函數。
因此理解為,即使我們沒定義對象,但是可以調用沒有成員屬性的成員函數。
如果定義的是空對象,那么也不可以對對象成員屬性進行賦值。
因為得0就是沒空間,1B的占用,但是如果是new的,那么是一個沒賦初值的空間。
在類成員函數中,如果有與成員屬性同名的變量存在,那么將如何區分呢?
就是this指針,例如都是a,但是在類中可以用this->a來表示,這是成員屬性。
this的類型是類的指針。
注意的是:this指的是:對象的地址&obj,也就是說,如果你是空類或者沒new,那么this是不存在的。
這也就理解了,靜態成員函數,是沒有this指針的。
因此靜態成員函數,即使沒定義對象也是可以使用的。
非靜態成員函數,必須通過對象調用。
空對象,只能調用沒有成員屬性的。
this只存在于函數的參數里,是用來調用對象地址的。使用this完成的封裝。
const
const變量:1、定義就要初始化,2、不可以修改。
const*隨便指,不能改內容。*const里面隨便換,不能改指。
類中的const成員屬性,必須通過初始化列表初始化。構造函數的初始化列表在類名()之后,用冒號開始,逗號分隔。
邏輯順序:創建對象——構造函數——初始化列表——構造中的內容。
類常成員函數,const寫在函數名()之后,void show() const。
常函數:可以用普通變量,但是不能修改普通變量,常變量本身就不能修改,無論在哪。
常對象:只能用常函數,不能用普通函數。
常對象可以調用任何屬性。
理解為:this指針從*變成了const*類型了,因此就不能修改內容了。降低安全性。
初始化列表
按照變量定義的順序執行,也就是行數先后,與自己寫的順序無關。
int b; int a; lei(int x):a(b),b(x){}如上代碼所示,即使是列表中a寫在前面,但是定義時,b先定義的,那么就先執行b(x),然后執行a,這樣就不會有亂碼。
類中不能定義自己類的對象,但是可以定義自己類的指針,也需要在列表中初始化。
static
靜態編譯期就存在,每次調用,都是這一個東西。
也就是說,靜態成員屬性和函數,都可以不用對象就能調用。
靜態成員屬性要在類外進行初始化,static int a; int lei::a=10;
初始化也要加上成員的類型,也就是先int才行。
靜態成員和函數也都不占用內存,要不無法解釋無需對象調用這件事。
靜態成員函數:制衡使用靜態成員。
理由就是沒有this指針。因為無需對象調用。
const:能不能改,static:能不能用。
類之間的關系
組合(復合)、依賴、關聯、聚合。
part of、use、have、combine。
當對象作為參數,盡量使用引用,如果怕被修改,再加入const。
總結
- 上一篇: 安卓手机左右声道调节应用下载_闪电全能格
- 下一篇: C++ 正则获取url中参数