C 知識總結 P02 修飾

2022-09-13 01:12:12 字數 2605 閱讀 4743

常量

使用巨集define定義常量是常見的行為,在c++中還可以使用const關鍵字來實現常量的定義。

const double pi = 3.1415926535;
在類中使用常量,為了避免每個例項都產生乙個常量,可以使用

static const double pi = 3.1415926535
但是在函式中定義的常量,即使重複呼叫函式,也不會發生浪費空間的問題。

常引用、常指標

在某些情況下,如在函式引數傳遞中,為避免使用引用、指標修改指向的變數,可使用如下形式的 const 。此時雖然指向的物件可能是非 const 的,但是無法通過 const 引用或 const 指標修改。

void f(const double& t);

void f(const double* p);

另外,如果目的是防止指標本身被修改,可以使用double* const p的形式。(引用沒有這種問題,因為引用無法被修改。)

const修飾的函式返回值

const修飾下的函式返回值,可以防止該值被修改,但是接收該函式返回值的變數也必須有const屬性。

const int f() {}

const int a = f();

const修飾的成員函式

const修飾的成員函式,不修改例項的成員變數。另外,如果乙個物件例項化為乙個常量物件,只能呼叫它的常成員函式。

class typesample 

}

靜態全域性變數與靜態區域性變數

使用static修飾全域性變數,與無static修飾的全域性變數功能相同,區別為被static修飾後的全域性變數只能在本檔案中使用,在其他檔案中無法使用。

使用static修飾函式內的區域性變數,可以使該變數在函式執行結束時不被銷毀,可以利用靜態區域性變數實現多次函式呼叫間的資訊傳遞。需要強調的是,static並不改變區域性變數的作用域,也就是說在函式外部是無法訪問靜態區域性變數的。

靜態函式

在函式的宣告前加上static修飾,作用與靜態全域性變數相同,使該函式只能在本檔案中使用,在其他檔案中無法使用。

靜態成員變數與靜態成員函式

使用static修飾的類成員變數,與普通的成員變數的區別是:普通成員變數是屬於例項的,但是靜態成員變數是屬於類的,是類的所以例項所共有的。可以用來存放類的常量,以及僅與類本身相關的屬性。

同樣的,靜態成員函式是屬於類的,與普通的成員函式的區別是:普通成員函式都隱含了this指標,該指標指向例項本身,用來訪問例項的成員變數和成員函式,但this指標不是指向類的,故靜態成員函式沒有this指標。這種區別造成了靜態成員函式只能訪問靜態成員變數,也只能呼叫靜態成員函式,但普通成員函式沒有這種限制;另外可以使用class_name::static_func()的方式直接呼叫靜態成員函式。

使用外部變數

如果需要在某個工程檔案中使用其它檔案中定義的變數,可以使用extern指定。在需要使用外部變數的地方,放置乙個extern修飾的變數宣告即可。

#include "other.h"

extern int param; // 此變數在 other.h 中有定義

使用 c 的**

extern的另乙個使用方法是在 c++ 中使用 c 的**。在需要使用 c 的地方,使用extern "c"告知編譯器。

extern "c" 

// 如果只想使用其中的乙個函式

extern "c"

const關鍵字並沒有明確說明是在編譯期間為常量還是在執行期間為常量,constexpr告知編譯器該語句或函式在編譯期間就是常量,也就是說這些語句或函式在編譯期間就可以計算出來。constexprconst更為嚴格,但是能夠讓編譯器對**進行更多的優化,在能使用constexpr的情況下推薦使用constexpr代替const

auto關鍵字用於宣告變數時自動推導變數的型別,適合冗長的變數型別,過多的使用auto會造成**可讀性下降,另外某些情況下auto可能存在歧義,為後續**帶來隱患。

decltype()也是用於推導變數的型別,用於已經存在的變數。

auto iter = vec.begin();

using iter = decltype(iter);

動態規劃 揹包問題 P02 完全揹包

完全揹包問題也是乙個相當基礎的揹包問題,它有兩個狀態轉移方程,分別在 基本思路 以及 o vn 的演算法 的小節中給出。有n種物品和乙個容量為v的揹包,每種物品都有無限件可用。第i種物品的體積是w i 價值是c i 求解將哪些物品裝入揹包可使這些物品的費用總和不超過揹包容量,且價值總和最大。這個問題...

AT24C02的知識總結

這週做清除報警記錄功能,所使用的儲存器晶元是at24c02,下面介紹at24c02使用的幾點關鍵點 1.at24c02寫資料和讀資料都是乙個位元組 8位 讀2個位元組 16位 會出錯,看下面datasheet 2.at24c02有2k的儲存容量,2k 2 1024 2048個位元組 所以最多可以往a...

c 獲取當前路徑 P02絕對路徑和相對路徑

本地檔案讀寫依賴檔案路徑,本節簡單介紹下相對路徑和絕對路徑,只侷限在本地路徑,不涉及網路路徑。絕對路徑 絕對路徑就是以根目錄為參照系的路徑,根目錄 windows下是碟符 是固定的,所以每個檔案只有乙個絕對路徑。windows下資料夾的位址列展示的就是當前資料夾的絕對路徑,或者開啟命令列工具 在位址...