根據(jù)之前學習的進行總結,溫故而知新,理解有誤請大佬們評論區(qū)指正,感謝~
基本概念理解在整個代碼編譯過程中,除了語言上的標準外,對編譯的概念理解通透也是必需的:
關于.h .hpp .cpp的理解#ifndef TEST_H_
#define TEST_H_
///代碼
#endif
封裝成dll和lib區(qū)別首先,dll和lib都是鏈接庫,dll是動態(tài)鏈接庫,lib是靜態(tài)鏈接庫。靜態(tài)庫是指在鏈接的過程中,將該庫中的代碼完全復制到可執(zhí)行文件中;動態(tài)庫是指可以被不同進程調(diào)用但不屬于可執(zhí)行文件的函數(shù),可由多個程序同時使用。總之,lib是編譯時用到的,dll是運行時用到的。
stdafx.h和stdafx.cppStdAfx.h, StdAfx.cpp這些文件用于生成名為.pch 的預編譯頭 (PCH) 文件和名為 StdAfx.obj 的預編譯類型文件。
全局變量global和靜態(tài)變量static區(qū)別全局變量和靜態(tài)變量在內(nèi)存中存放在同一位置,即靜態(tài)區(qū)/全局區(qū)。
從作用域來看:
靜態(tài)變量的生命周期為整個源程序,其作用域仍與普通變量相同
靜態(tài)全局變量也具有全局作用域,他與全局變量的區(qū)別在于如果程序包含多個文件的話,他作用于定義它的文件里,不能作用到其他文件里,即被static關鍵字修飾過的變量具有文件作用域。這樣即使兩個不同的源文件都定義了相同的靜態(tài)全局變量,他們也是不同的變量
從生命周期看:
都在程序運行時期全程有效
全局變量:用extern聲明,也稱之為外部變量,是在方法外部定義的變量。它不屬于哪個方法,而是屬于整個源程序。作用域是整個源程序。如果全局變量和局部變量重名,則在局部變量作用域內(nèi),全局變量被屏蔽,不起作用。編程時候盡量不使用全局變量。
靜態(tài)變量:用static聲明,從面向?qū)ο蟮慕嵌扔|發(fā),當需要一個數(shù)據(jù)對象為整類而非某個對象服務,同時有力求不破壞類的封裝性,既要求此成員隱藏在類的內(nèi)部,有要求對外不可見的時候,就可以使用static。
argc 是 argument count的縮寫,表示傳入main函數(shù)的參數(shù)個數(shù);
argv 是 argument vector的縮寫,表示傳入main函數(shù)的參數(shù)序列或指針,并且第一個參數(shù)argv[0]一定是程序的名稱,并且包含了程序所在的完整路徑;
通常我們知道有變量和常量的定義,例如int a=10; 那么a是個變量,值可以變的量;10是個常量,值不能變的量;那么在c++中例如用const int a=10,理論上a是個變量,但由于const限定符,導致其是個常量,因此將其稱之為符號常量;符號常量的定義通常有兩種方式實現(xiàn):#define和const,區(qū)別是define只是做個文本替換
枚舉類型enumenum稱為枚舉數(shù)據(jù)類型,就是可以一個個列舉出來的東西,比如星期幾或者性別,可以清楚知道里面有什么內(nèi)容的數(shù)據(jù),一般使用形式是 enum 枚舉名{枚舉列表, ,}枚舉變量名;其中枚舉名和變量名都是可有可無的,枚舉列表默認是從0開始賦值,逐漸加一的一個符號常量的幾何,也可以直接進行整型常量的賦值;作用就是 相比const和define有了enum可以更加簡潔的定義很多個符號常量,更加方便;一般是需要定義多個符號常量時,例如errorcode或者需要定義常量時使用;
enum Type
{
INFO,
ERRO,
WARN,
DEBUG,
};
結構體struct首次,為什么會衍生出結構體這個東西,本身我們所學的基本類型中有一維的,就是各種變量,字符串,布爾量;二維的有數(shù)組等;但是呢由于數(shù)組中的成員都是同一數(shù)據(jù)類型,那么如果不同數(shù)據(jù)類型的集合就可以用結構體來定義了。在c++中,struct定義的后面直接是變量名;而typedef struct定義的后面是結構體類型,區(qū)別就是結構體類型需要實例化之后才能訪問結構體中的成員。
c++中的struct相比c中的已經(jīng)擴充了很多內(nèi)容,不僅可以包含不同類型的成員變量,也可以包含成員函數(shù)、可繼承、可多態(tài),那么與class的區(qū)別就是:struct中的成員默認是public的,而class中的成員默認是private
一個 union 可以有多個數(shù)據(jù)成員,但是在任意時刻只有一個數(shù)據(jù)成員可以有值。當某個成員被賦值后其他成員變?yōu)槲炊x狀態(tài)。
類其實也就是一種數(shù)據(jù)類型,跟結構體差不多,它的目的就是多了一層封裝,類似于你寫一堆函數(shù)放在一個cpp中,在別的里面再調(diào)用,類就相當于寫了一堆函數(shù),再封裝一下,再把一堆的類放在一個cpp中,這樣做的好處是在大項目中能夠更加清晰看懂代碼邏輯,方便組織管理代碼。類是一種數(shù)據(jù)類型,它的實例化就叫做對象,不同于struct對應的變量就叫變量。
類中一般包括成員函數(shù)和成員變量,定義class 類名{public/private:成員變量;函數(shù)};類只是一個模板,不占用內(nèi)存空間,只有實例化之后才會占內(nèi)存,創(chuàng)建對象后可以通過對象名.成員名來訪問類中的成員
指針這個東西其實就跟編程的底層有關了,其實在編程中定義的所有東西都會占用內(nèi)存空間,那如果我們直接對內(nèi)存空間進行修改的話,很大程度會增加編程的靈活性,這樣指針就產(chǎn)生了,指針其實也就是個變量,本身也會占用內(nèi)存空間,但是與一般變量不同的是,指針變量中存儲的內(nèi)容是內(nèi)存空間的地址,通過這個地址,我們就可以找到這個內(nèi)存空間對應的變量了
編譯器常用操作 Visual Studio(VS)—Windowsvoid register(fun)
{
//新開一個線程,判斷什么時候觸發(fā)fun
if(...)
{
fun();
}
}
回調(diào)函數(shù)
void callback()
{
//觸發(fā)回調(diào)之后要做的事情
}
主函數(shù)
int main()
{
register(callback);
return 0;
}
結構體作為形參傳遞參考鏈接
推薦鏈接中的第三種
int test*()
{
int *a[3]={0,1,2};
return a;
}
int main()
{
int *res;
res = test();
std::cout<< res[0]<< std::endl;
}
在C語言中,動態(tài)分配內(nèi)存用 malloc() 函數(shù),釋放內(nèi)存用 free() 函數(shù);C++中使用new 和 delete:new 用來動態(tài)分配內(nèi)存,delete 用來釋放內(nèi)存。
int *p = new int; //分配1個int型的內(nèi)存空間
delete p; //釋放內(nèi)存
int *p = new int[10]; //分配10個int型的內(nèi)存空間
delete[] p;
通常 new 和 delete、new[] 和 delete[] 操作符應該成對出現(xiàn)
參考鏈接:繼承和派生
繼承和派生繼承是指繼承方式,public\protected\private;派生是指繼承了基類的派生類(也就是繼承了父的子),其中父的private在子和外人中均不可訪問,畢竟是爸比私人的秘密哈哈哈兒子也不可以訪問的喲~而父的protected可以被子訪問,外人不可訪問,public那就是everyone都可以訪問;另外子繼承了的成員變量也可以在自己的類中變更訪問方式哦
class 子類名:繼承方式(public/protected/private)父類名
如果派生類中的成員(包括成員變量和成員函數(shù))和基類中的成員重名,那么就會遮蔽從基類繼承過來的成員,不會構成重載。但是,基類中的成員函數(shù)仍然可以訪問,不過要加上類名和域解析符。
構造-----類的一種特殊的成員函數(shù),它會在每次創(chuàng)建類的新對象時執(zhí)行。構造函數(shù)可用于為某些成員變量設置初始值,名稱與類名相同。
采用參數(shù)初始化表,成員變量的賦值順序由它們在類中的聲明順序決定,初始化 const 成員變量的唯一方法就是使用參數(shù)初始化表。派生類只能采用構造函數(shù)初始化列表的方式向基類或成員對象的構造函數(shù)傳遞參數(shù)。
Student::Student(char *name, int age, float score): m_name(name), m_age(age), m_score(score){
//TODO:
}
構造函數(shù)必須是 public 屬性的,否則創(chuàng)建對象時無法調(diào)用。
不管是聲明還是定義,函數(shù)名前面都不能出現(xiàn)返回值類型,即使是 void 也不允許;
函數(shù)體中不能有 return 語句。
構造函數(shù)是允許重載的。一個類可以有多個重載的構造函數(shù),創(chuàng)建對象時根據(jù)傳遞的實參來判斷調(diào)用哪一個構造函數(shù)。
先構造基類,再構造成員,最后構造自身(調(diào)用構造函數(shù))。
在設計派生類時,對繼承過來的成員變量的初始化工作也要由派生類的構造函數(shù)完成,但是大部分基類都有 private 屬性的成員變量,它們在派生類中無法訪問,更不能使用派生類的構造函數(shù)來初始化。
解決這個問題的思路是:在派生類的構造函數(shù)中調(diào)用基類的構造函數(shù)。
//People(name, age)就是調(diào)用基類的構造函數(shù)
Student::Student(char *name, int age, float score): People(name, age), m_score(score){ }
定義派生類構造函數(shù)時最好指明基類構造函數(shù);如果不指明,就調(diào)用基類的默認構造函數(shù)(不帶參數(shù)的構造函數(shù))
拷貝(復制)構造函數(shù)參考鏈接
當同一個類的對象2要拷貝對象1時,例如class A:
A a1(1,2,3);
A a2(a1);
當a2實例化的時候,就會調(diào)用默認的或者非默認的(程序中重新編寫的)拷貝構造函數(shù);
只有在初始化的時候才會調(diào)用拷貝構造,而在賦值語句不會引發(fā)復制構造函數(shù)的調(diào)用。(賦值語句的等號左邊是一個早已有定義的變量)
析構-----它會在每次刪除所創(chuàng)建的對象時執(zhí)行。析構函數(shù)有助于在跳出程序(比如關閉文件、釋放內(nèi)存等)前釋放資源。析構函數(shù)沒有參數(shù),不能被重載,因此一個類只能有一個析構函數(shù)。
在所有函數(shù)之外創(chuàng)建的對象是全局對象,它和全局變量類似,位于內(nèi)存分區(qū)中的全局數(shù)據(jù)區(qū),程序在結束執(zhí)行時會調(diào)用這些對象的析構函數(shù)。
在函數(shù)內(nèi)部創(chuàng)建的對象是局部對象,它和局部變量類似,位于棧區(qū),在局部函數(shù)執(zhí)行結束時會調(diào)用這些對象的析構函數(shù)。
new 創(chuàng)建的對象位于堆區(qū),通過 delete 刪除時才會調(diào)用析構函數(shù);如果沒有 delete,析構函數(shù)就不會被執(zhí)行。
創(chuàng)建派生類對象時,構造函數(shù)的執(zhí)行順序和繼承順序相同,即先執(zhí)行基類構造函數(shù),再執(zhí)行派生類構造函數(shù)。
而銷毀派生類對象時,析構函數(shù)的執(zhí)行順序和繼承順序相反,即先執(zhí)行派生類析構函數(shù),再執(zhí)行基類析構函數(shù)。
為了解決多繼承時的命名沖突和冗余數(shù)據(jù)問題,C++ 提出了虛繼承virtual,使得在派生類中只保留一份間接基類的成員。
兩種創(chuàng)建對象的方式:一種是在棧上創(chuàng)建,
Student stu;
Student *pStu = &stu;
在棧上創(chuàng)建對象時,實參位于對象名后面,例如Student stu(“小明”, 15, 92.5f);
另外一種是在堆上創(chuàng)建,
Student *pStu = new Student;
delete pStu; //刪除對象
棧內(nèi)存是程序自動管理的,不能使用 delete 刪除在棧上創(chuàng)建的對象;堆內(nèi)存由程序員管理,對象使用完畢后可以通過 delete 刪除。
成員變量大都以m_開頭,這是約定成俗的寫法,不是語法規(guī)定的內(nèi)容。以m_開頭既可以一眼看出這是成員變量,又可以和成員函數(shù)中的形參名字區(qū)分開。
根據(jù)C++軟件設計規(guī)范,實際項目開發(fā)中的成員變量以及只在類內(nèi)部使用的成員函數(shù)(只被成員函數(shù)調(diào)用的成員函數(shù))都建議聲明為 private,而只將允許通過對象調(diào)用的成員函數(shù)聲明為 public。
給成員變量賦值的函數(shù)通常稱為 set 函數(shù),它們的名字通常以set開頭,后跟成員變量的名字;讀取成員變量的值的函數(shù)通常稱為 get 函數(shù),它們的名字通常以get開頭,后跟成員變量的名字。
除了 set 函數(shù)和 get 函數(shù),在創(chuàng)建對象時還可以調(diào)用構造函數(shù)來初始化各個成員變量。
引用的定義方式類似于指針,只是用&取代了*,語法格式為:
type &name = data;
引用必須在定義的同時初始化,并且以后也要從一而終,不能再引用其它數(shù)據(jù),這有點類似于常量(const 變量)。
注意,引用在定義時需要添加&,在使用時不能添加&,使用時添加&表示取地址。
如果不希望通過引用來修改原始的數(shù)據(jù),那么可以在定義時添加 const 限制,形式為:
const type &name = value;
在當前類以外定義的、不屬于當前類的函數(shù)也可以在類中聲明,但要在前面加 friend 關鍵字,這樣就構成了友元函數(shù)。
友元函數(shù)不同于類的成員函數(shù),在友元函數(shù)中不能直接訪問類的成員,必須要借助對象。
class Student{
public:
Student(char *name, int age, float score);
public:
friend void show(Student *pstu); //將show()聲明為友元函數(shù)
private:
char *m_name;
int m_age;
float m_score;
};
//非成員函數(shù)
void show(Student *pstu){
cout
引入內(nèi)聯(lián)函數(shù)的目的是為了解決程序中函數(shù)調(diào)用的效率問題,這么說吧,程序在編譯器編譯的時候,編譯器將程序中出現(xiàn)的內(nèi)聯(lián)函數(shù)的調(diào)用表達式用內(nèi)聯(lián)函數(shù)的函數(shù)體進行替換,而對于其他的函數(shù),都是在運行時候才被替代。只有當函數(shù)只有 10 行甚至更少時才將其定義為內(nèi)聯(lián)函數(shù).內(nèi)聯(lián)該函數(shù)可以令目標代碼更加高效. 對于存取函數(shù)以及其它函數(shù)體比較短, 性能關鍵的函數(shù), 鼓勵使用內(nèi)聯(lián).
在類體中定義的成員函數(shù)會自動成為內(nèi)聯(lián)函數(shù)
只有類的成員函數(shù)才有 this 指針,成員函數(shù)通過一個名為 this 的額外隱式參數(shù)來訪問調(diào)用它的那個對象,this就是指的調(diào)用對象
this 是 const 指針,this 只能在成員函數(shù)內(nèi)部使用,用在其他地方?jīng)]有意義,也是非法的
使用 static 關鍵字來把類成員定義為靜態(tài)的,靜態(tài)成員在類的所有對象中是共享的,類似于全局變量的含義
static 成員變量必須在類聲明的外部初始化,具體形式為:
type class::name = value;
static 成員變量既可以通過對象來訪問,也可以通過類來訪問
靜態(tài)成員函數(shù)靜態(tài)成員函數(shù)即使在類對象不存在的情況下也能被調(diào)用,靜態(tài)函數(shù)只要使用類名加范圍解析運算符 :: 就可以訪問。
靜態(tài)成員函數(shù)沒有 this 指針,只能訪問靜態(tài)成員(包括靜態(tài)成員變量和靜態(tài)成員函數(shù))。靜態(tài)成員函數(shù)與普通成員函數(shù)的根本區(qū)別在于:普通成員函數(shù)有 this 指針,可以訪問類中的任意成員;而靜態(tài)成員函數(shù)沒有 this 指針,只能訪問靜態(tài)成員(包括靜態(tài)成員變量和靜態(tài)成員函數(shù))。
#includeusing namespace std;
class A
{public:
A(int x):m_x(x){};
static void f(A a);
private:
int m_x;
};
void A::f(A a)
{//靜態(tài)成員函數(shù)只能引用屬于該類的靜態(tài)數(shù)據(jù)成員或靜態(tài)成員函數(shù)。
// cout<A a(5);
a.f(a);
// system("pause");
return 0;
}
重載運算符和重載函數(shù)重載必須滿足形參的類型/個數(shù)/順序不同,不能靠返回類型不同重載函數(shù)!
一般將功能類似的函數(shù)用于重載
重載大部分 C++ 內(nèi)置的運算符,就能使用自定義類型的運算符。重載的運算符是帶有特殊名稱的函數(shù),函數(shù)名是由關鍵字 operator 和其后要重載的運算符符號構成的。
繼承時,要養(yǎng)成的一個好習慣就是,基類析構函數(shù)中,加上virtual。這是為了防止內(nèi)存泄漏。假設基類中采用的是非虛析構函數(shù),當刪除基類指針指向的派生類對象時就不會觸發(fā)動態(tài)綁定,因而只會調(diào)用基類的析構函數(shù),而不會調(diào)用派生類的析構函數(shù)。那么在這種情況下,派生類中申請的空間就得不到釋放從而產(chǎn)生內(nèi)存泄漏。所以,為了防止這種情況的發(fā)生,C++中基類的析構函數(shù)應采用virtual虛析構函數(shù)。
多態(tài)多態(tài)按字面的意思就是多種形態(tài)。當類之間存在層次結構,并且類之間是通過繼承關聯(lián)時,就會用到多態(tài)。
C++中虛函數(shù)的唯一用處就是構成多態(tài),基類指針可以按照基類的方式來做事,也可以按照派生類的方式來做事,它有多種形態(tài),或者說有多種表現(xiàn)方式,我們將這種現(xiàn)象稱為多態(tài)。
通過基類指針只能訪問派生類的成員變量,但是不能訪問派生類的成員函數(shù)。
C++提供多態(tài)的目的是:可以通過基類指針對所有派生類(包括直接派生和間接派生)的成員變量和成員函數(shù)進行“全方位”的訪問,尤其是成員函數(shù)。如果沒有多態(tài),我們只能訪問成員變量。
有虛函數(shù)才能構成多態(tài),這節(jié)我們來重點說一下虛函數(shù)的注意事項:
賦值的本質(zhì)是將現(xiàn)有的數(shù)據(jù)寫入已分配好的內(nèi)存中,對象的內(nèi)存只包含了成員變量,所以類對象之間的賦值是成員變量的賦值,成員函數(shù)不存在賦值問題。
把派生類對象賦值給基類對象。 把派生類對象的地址賦值給基類指針。 用派生類對象初始化基類對象的引用。 反之則不行,即不能把基類對象賦值給派生類對象;不能把基類對象的地址賦值給派生類對象的指針;也不能把基類對象作為派生對象的引用。這種轉(zhuǎn)換關系是不可逆的,只能用派生類對象給基類對象賦值,而不能用基類對象給派生類對象賦值。
const 可以用來修飾成員變量、成員函數(shù)以及對象。如果你不希望某些數(shù)據(jù)被修改,可以使用const關鍵字加以限定。
const 成員函數(shù)可以使用類中的所有成員變量,但是不能修改它們的值;常成員函數(shù)需要在聲明和定義的時候在函數(shù)頭部的結尾加上 const 關鍵字
class Student{
public:
Student(char *name, int age, float score);
void show();
//聲明常成員函數(shù)
char *getname() const;
int getage() const;
float getscore() const;
private:
char *m_name;
int m_age;
float m_score;
};
//定義常成員函數(shù)
char * Student::getname() const{
return m_name;
}
常對象: const定義的常對象必須進行初始化,而且不能被更新。 (類名 const 對象名 ),通過常對象只能調(diào)用它的常成員函數(shù),普通對象調(diào)用普通成員函數(shù)
常引用:被引用的對象不能被更新。 const 類型說明符 &引用名
常數(shù)組:數(shù)組元素不能被更新。 類型說明符 const 數(shù)組名[大小]
常指針:指向常量的指針。
所謂函數(shù)模板,實際上是建立一個通用函數(shù),它所用到的數(shù)據(jù)的類型(包括返回值類型、形參類型、局部變量類型)可以不具體指定,而是用一個虛擬的類型來代替(實際上是用一個標識符來占位),等發(fā)生函數(shù)調(diào)用時再根據(jù)傳入的實參來逆推出真正的類型。這個通用函數(shù)就稱為函數(shù)模板(Function Template)。
templatevoid Swap(T *a, T *b){
T temp = *a;
*a = *b;
*b = temp;
}
template
//在函數(shù)體中可以使用類型參數(shù)
}
//聲明
template//這里不能有分號
class Point{public:
Point(T1 x, T2 y): m_x(x), m_y(y){}
public:
T1 getX() const; //獲取x坐標
void setX(T1 x); //設置x坐標
T2 getY() const; //獲取y坐標
void setY(T2 y); //設置y坐標
private:
T1 m_x; //x坐標
T2 m_y; //y坐標
};
//定義
templatevoid Point::setY(T2 y){m_y = y;
}
//實例化,在實例化時必須顯式地指明數(shù)據(jù)類型,
Pointp1(10, 20);
Point*p1 = new Point(10.6, 109.3);
常用的頭文件你是否還在尋找穩(wěn)定的海外服務器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準確流量調(diào)度確保服務器高可用性,企業(yè)級服務器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧
本文名稱:2022-12-15c++總結-創(chuàng)新互聯(lián)
文章網(wǎng)址:http://chinadenli.net/article22/decpcc.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供虛擬主機、ChatGPT、云服務器、App開發(fā)、面包屑導航、App設計
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容