Hello,大家好!我是木榮。 溫故而知新,可以為師矣 。作為一名攻城獅,扎實的基本功是解決問題及完成工作中任務(wù)的重要前提。沒有良好的基本功作為鋪墊,一味的追求知識的寬度是毫無意義,知其然更要知其所以然。因此,在平時和小伙伴們聊天時,在談到學習技術(shù)方面的問題,我會告訴他們注重基本功。所以,最近文章會總結(jié)一些日常編程工作中常用的重要基本知識點,根據(jù)平時工作中常用的也是重要的知識點逐步展開。
為了提高閱讀的舒適性,不會像其他博主的什么萬字長文,一篇講解完成,那樣即浪費時間,篇幅過長記住的知識點也不會很多。所以,所有知識點會分多章多節(jié)發(fā)布,每篇盡量讓大家短時間讀完而盡可能記住知識點,希望喜歡的小伙伴們加關(guān)注呦!
常用關(guān)鍵字
C/C++首先我們先來了解一下修飾符
的定義。
修飾符在C/C++中,修飾符(modifiers)是用于修改基本數(shù)據(jù)類型的關(guān)鍵字,用于改變變量的存儲方式、作用域或其他特性。
const
const關(guān)鍵字是一種修飾符。就 const 修飾符而言,它用來告訴編譯器,被修飾的這些部分的特點具有只讀屬性。在編譯的過程中,一旦編寫代碼試圖去改變這些部分,編譯器就會給出錯誤提示。防止編程中出現(xiàn)語法及邏輯的錯誤,提高代碼的健壯性及規(guī)范性。
- 修飾變量說明該變量不可以被改變
- 修飾指針分為指向常量的指針和指針常量
- 修飾引用常量引用,經(jīng)常用于形參類型,即避免了拷貝,又避免了函數(shù)對值的修改
- 修飾成員函數(shù)說明該成員函數(shù)內(nèi)不能修改成員變量
//類
class Test
{
public:
Test() : a(0) { }; // 初始化參數(shù)列表
Test(int x) : a(x) { }; // 初始化參數(shù)列表
int getV(); // 普通成員函數(shù)
int getV() const; // 常成員函數(shù),不得修改類中的任何數(shù)據(jù)成員的值
private:
const int a; // 常對象成員,只能在初始化列表賦值
};
void Func()
{
Test b; // 普通對象,可以調(diào)用全部成員函數(shù)
const Test a; // 常對象,只能調(diào)用常成員函數(shù),修改常成員變量
const Test *p = &a; // 常指針
const Test &q = a; // 常引用
// 如果const位于星號*的左側(cè),則const就是用來修飾指針所指向的變量,即指針指向為常量;
// 如果const位于星號的右側(cè),const就是修飾指針本身,即指針本身是常量。
const int* a; // 常量指針 指針指向的常量不可修改
int const *a; // 常量指針 指針指向的常量不可修改(同上)
int* const a; // 指針常量 指針不可修改
const int* const; // 常量指針常量 指針和指向的常量都不可修改
// 引用 引用a不能被修改
int x;
int const &a=x;
const int &a=x;
}
static
static關(guān)鍵字常用于修飾變量和函數(shù)
- 修飾普通變量修改變量的存儲區(qū)域和生命周期,使變量存儲在靜態(tài)存儲區(qū),在 main函數(shù)運行前就分配了空間,如果有初始值就用初始值初始化它,如果沒有初始值系統(tǒng)用默認值初始化它。
- 修飾普通函數(shù)表明函數(shù)的作用范圍,僅在定義該函數(shù)的文件內(nèi)才能使用。在多人開發(fā)項目時,為了防止與他人命名空間里的函數(shù)重名,可以將函數(shù)定位為 static。
- 修飾成員變量修飾成員變量使所有的對象只保存一個該變量,而且不需要生成對象就可以訪問該成員。
- 修飾成員函數(shù)修飾成員函數(shù)使得不需要生成對象就可以訪問該函數(shù),但是在 static 函數(shù)內(nèi)不能訪問非靜態(tài)成員。
- 在函數(shù)內(nèi)部使用static關(guān)鍵字聲明的變量是靜態(tài)變量,它在程序的生命周期內(nèi)保持其值,不會在每次函數(shù)調(diào)用時重新初始化。靜態(tài)變量存儲在靜態(tài)數(shù)據(jù)區(qū),而不是棧上。當一個靜態(tài)變量在函數(shù)內(nèi)部聲明時,它會在程序運行時初始化并保留其值。
#include < iostream >
void functionWithStatic() {
static int count = 0; // 靜態(tài)變量,在多次調(diào)用該函數(shù)時,count的值保留
count++;
std::cout < < "Static count: " < < count < < std::endl;
}
int main() {
functionWithStatic(); // 輸出 Static count: 1
functionWithStatic(); // 輸出 Static count: 2
functionWithStatic(); // 輸出 Static count: 3
return 0;
}
在C/C++中,使用static關(guān)鍵字在類中聲明的成員函數(shù)被稱為靜態(tài)函數(shù),也稱為類的靜態(tài)成員函數(shù)。靜態(tài)函數(shù)與類的實例無關(guān),可以直接通過類名調(diào)用,而無需通過對象。
class MyClass {
public:
static void staticFunction() {
std::cout < < "This is a static function." < < std::endl;
}
};
int main() {
MyClass::staticFunction(); // 直接通過類名調(diào)用靜態(tài)函數(shù)
MyClass obj;
obj.staticFunction(); // 也可以通過對象調(diào)用靜態(tài)函數(shù),但不是推薦做法
return 0;
}
在類中使用static關(guān)鍵字聲明的數(shù)據(jù)成員被稱為靜態(tài)數(shù)據(jù)成員,它屬于類本身,而不是類的實例。靜態(tài)數(shù)據(jù)成員在所有類的實例之間共享,類的所有對象共享同一個靜態(tài)數(shù)據(jù)成員。
class MyClass {
public:
static int staticData; // 靜態(tài)數(shù)據(jù)成員的聲明
};
int MyClass::staticData = 42; // 靜態(tài)數(shù)據(jù)成員的定義和初始化
int main() {
MyClass obj1;
MyClass obj2;
obj1.staticData = 10;
std::cout < < "obj1.staticData: " < < obj1.staticData < < std::endl; // 輸出 obj1.staticData: 10
std::cout < < "obj2.staticData: " < < obj2.staticData < < std::endl; // 輸出 obj2.staticData: 10
return 0;
}
在文件中使用static關(guān)鍵字聲明的全局變量(位于函數(shù)外部)具有文件作用域,它們只在聲明它們的文件中可見,不會被其他文件訪問。這些靜態(tài)變量不能被其他文件直接訪問,因此在不同文件中使用相同名稱的靜態(tài)變量不會造成命名沖突。
// File1.cpp
static int file1StaticVar = 10;
// File2.cpp
static int file2StaticVar = 20;
以上是static關(guān)鍵字在C/C++中的常見用法。請注意,使用static關(guān)鍵字的具體含義可能會因上下文而異,因此應(yīng)根據(jù)具體情況理解和使用。
this指針
在C++中,this指針是一個特殊的指針,它是一個隱藏的指針,指向當前對象(即正在調(diào)用該成員函數(shù)的對象)。this指針在成員函數(shù)內(nèi)部自動創(chuàng)建,可以在成員函數(shù)中使用,用于訪問當前對象的成員變量和成員函數(shù)。
this指針是一個隱式參數(shù),它并不需要顯式地傳遞,編譯器會在調(diào)用成員函數(shù)時自動傳遞它。
以下是關(guān)于this指針的一些詳細解釋:
- this指針的類型:this指針的類型是指向當前類對象的指針,它的類型是指向當前類的常量指針(const指針)。這是因為在成員函數(shù)中,不能通過this指針來修改當前對象的值,以保證成員函數(shù)的const屬性能夠得到維持。
- this指針的用途:在成員函數(shù)中,使用this->可以訪問當前對象的成員變量和成員函數(shù),以區(qū)分成員變量和函數(shù)參數(shù)的命名沖突。在類的靜態(tài)成員函數(shù)中,沒有this指針,因為靜態(tài)成員函數(shù)不依賴于特定的對象。
- this指針的使用場景:當成員函數(shù)中的參數(shù)和成員變量同名時,使用this指針可以明確指示成員變量。在類的方法鏈式調(diào)用中,返回this指針可以使調(diào)用更加簡潔。
下面是一個示例代碼,演示了this指針的用法:
#include < iostream >
class MyClass {
public:
int x;
MyClass(int x) : x(x) {}
void printX() {
std::cout < < "x = " < < this- >x < < std::endl;
}
MyClass& increment() {
this- >x++;
return *this;
}
};
int main() {
MyClass obj(10);
obj.printX(); // 輸出 x = 10
obj.increment().increment().increment();
obj.printX(); // 輸出 x = 13
return 0;
}
在上述示例中,this指針用于訪問成員變量x,并在方法鏈式調(diào)用中返回了當前對象的引用。這樣可以連續(xù)調(diào)用increment()函數(shù),并對成員變量x進行遞增操作。
總之,this指針在C++中是一個非常有用的特性,它使得在成員函數(shù)中能夠輕松訪問當前對象的成員,并提供了便捷的方式來實現(xiàn)方法鏈式調(diào)用。
inline內(nèi)聯(lián)函數(shù)
在C++中,inline是一個關(guān)鍵字,用于對函數(shù)進行內(nèi)聯(lián)展開。使用inline關(guān)鍵字聲明的函數(shù)被稱為內(nèi)聯(lián)函數(shù)。內(nèi)聯(lián)函數(shù)的主要目的是減少函數(shù)調(diào)用的開銷,通過在函數(shù)調(diào)用點展開函數(shù)代碼,可以避免函數(shù)調(diào)用的額外開銷,從而提高程序的執(zhí)行效率。
以下是內(nèi)聯(lián)函數(shù)的一些特點和注意事項:
定義:內(nèi)聯(lián)函數(shù)通常在類定義中聲明,也可以在函數(shù)定義時加上inline關(guān)鍵字。例如:
// 在類定義中聲明內(nèi)聯(lián)函數(shù)
class MyClass {
public:
inline void foo();
};
// 在函數(shù)定義時聲明內(nèi)聯(lián)函數(shù)
inline void MyClass::foo() {
// 函數(shù)代碼
}
- 編譯器決策:inline關(guān)鍵字只是向編譯器發(fā)出了一個請求,請求將函數(shù)內(nèi)容內(nèi)聯(lián)到調(diào)用點。編譯器會自行決定是否真正內(nèi)聯(lián)展開函數(shù)代碼,它可能會考慮函數(shù)的復(fù)雜性、調(diào)用頻率等因素來作出最優(yōu)的決策。
- 適用場景:內(nèi)聯(lián)函數(shù)對于短小且頻繁調(diào)用的函數(shù)效果最好,而對于復(fù)雜的函數(shù)或大量邏輯的函數(shù)可能并不適合內(nèi)聯(lián)。適當?shù)厥褂脙?nèi)聯(lián)函數(shù)可以提高性能,但濫用內(nèi)聯(lián)可能會導(dǎo)致代碼膨脹,增加可執(zhí)行文件的大小。
- 定義位置:通常將內(nèi)聯(lián)函數(shù)的定義放在頭文件中,因為在每個調(diào)用點都需要展開函數(shù)代碼,編譯器需要知道函數(shù)的實現(xiàn)細節(jié)。
- 不支持遞歸:內(nèi)聯(lián)函數(shù)不支持遞歸調(diào)用,因為遞歸調(diào)用無法在調(diào)用點展開。
- 靜態(tài)成員:類中的靜態(tài)成員函數(shù)默認是內(nèi)聯(lián)的,即使沒有顯式使用inline關(guān)鍵字。
使用內(nèi)聯(lián)函數(shù)的示例:
class MathUtil {
public:
inline static int add(int a, int b) {
return a + b;
}
};
int main() {
int result = MathUtil::add(5, 3);
return 0;
}
在上述示例中,add函數(shù)被聲明為內(nèi)聯(lián)靜態(tài)函數(shù)。在調(diào)用MathUtil::add(5, 3)時,編譯器會嘗試在調(diào)用點展開add函數(shù)的代碼,從而減少函數(shù)調(diào)用的開銷。
需要注意的是,雖然內(nèi)聯(lián)函數(shù)可以提高性能,但并不是所有的函數(shù)都適合內(nèi)聯(lián)。適當?shù)厥褂脙?nèi)聯(lián)函數(shù)是一種優(yōu)化手段,應(yīng)該根據(jù)實際情況和性能測試來決定是否使用內(nèi)聯(lián)。
評論
查看更多