const:
所修飾的對象或變量不能改變布持,修飾函數(shù)時筐眷,該函數(shù)不能修改在函數(shù)外面聲明的變量肿孵,也不能調(diào)用任何非const函數(shù)。在函數(shù)聲明和定義時都要加上const磷仰,放在函數(shù)參數(shù)列表的最后一個括號后袍嬉。
const_cast:
去除變量或?qū)ο蟮腸onst限定,格式為const_cast<int *>(const_p)
dynamic_cast:
dynamic_cast用于類繼承層次間的指針或引用轉(zhuǎn)換灶平。主要還是用于執(zhí)行“安全的向下轉(zhuǎn)型“伺通。向上轉(zhuǎn)型本身就是安全的。
enum:
enum(枚舉)類型逢享,給出一系列固定的值罐监,只能在這里面進行選擇一個。
explicit:
explicit關(guān)鍵字只能用于修飾只有一個參數(shù)的類構(gòu)造函數(shù), 它的作用是表明該構(gòu)造函數(shù)是顯示的, 而非隱式的瞒爬。e.g., CxString(int size){size_ = size}允許CxString tmp = 10;這樣子的構(gòu)造等同于CxString tmp(10), 與CxString tmp = ”cc“;混淆弓柱。
export:
為了訪問其他編譯單元(如另一代碼文件)中的變量或?qū)ο螅瑢ζ胀愋停òɑ緮?shù)據(jù)類侧但、結(jié)構(gòu)和類)矢空,可以利用關(guān)鍵字 extern,來使用這些變量或?qū)ο髸r禀横;但是對模板類型屁药,則必須在定義這些模板類對象和模板函數(shù)時,使用標準 C++ 新增加的關(guān)鍵字 export(導(dǎo)出)柏锄。
e.g.
// out.h:(聲明頭文件——只包含out函數(shù)的聲明信息)
template<class T> void out (const T& t);
// out.cpp:(定義代碼文件——包含out函數(shù)的聲明[通過include]和定義等全部信息)
#include <iostream>
#include “out.h”
export template<class T> void out (const T& t) {std::cerr << t;}
//user.cpp:(用戶代碼文件——包含函數(shù)的聲明頭文件后就可以使用該函數(shù))
#include “out.h”
// 使用out()
extern: extern(外部的)聲明變量或函數(shù)為外部鏈接酿箭,即該變量或函數(shù)名在其它文件中可見复亏。被其修飾的變量(外部變量)是靜態(tài)分配空間的,即程序開始時分配缭嫡,結(jié)束時釋放缔御。
//在test1.h中有下列聲明:
#ifndef TEST1H //防止頭文件的重復(fù)引用
#define TEST1H
extern char g_str[]; // 聲明全局變量g_str
#endif
// 在test1.cpp中
#include "test1.h"
char g_str[] = "123456"; // 定義全局變量g_str
//以上是test1模塊, 它的編譯和連接都可以通過,如果我們還有test2模塊也想使用g_str,只需要在原文件中引用就可以了
#include "test1.h"
void fun2()? ? { cout << g_str << endl;? ? }
friend: 友元可以訪問與其有 friend 關(guān)系的類中的 private/protected 成員妇蛀,通過友元直接訪問類中的 private/protected 成員的主要目的是提高效率耕突。
https://www.cnblogs.com/honeybusybee/p/5259265.html
inline: 在c/c++中,為了解決一些頻繁調(diào)用的小函數(shù)大量消耗椘兰埽空間(棧內(nèi)存)的問題有勾,特別的引入了inline修飾符,表示為內(nèi)聯(lián)函數(shù)古程。
e.g.
#include <stdio.h>
//函數(shù)定義為inline即:內(nèi)聯(lián)函數(shù)
inline char* dbtest(int a) {
? ? return (i % 2 > 0) ? "奇" : "偶";
}
int main(){
? for (i=1; i < 100; i++) {
? ? ? printf("i:%d? ? 奇偶性:%s /n", i, dbtest(i));? ?
? }
}
在內(nèi)部的工作就是在每個for循環(huán)的內(nèi)部任何調(diào)用dbtest(i)的地方都換成了(i%2>0)?”奇”:”偶”,這樣就避免了頻繁調(diào)用函數(shù)對棧內(nèi)存重復(fù)開辟所帶來的消耗喊崖。
注意:? 1. inline 是一種“用于實現(xiàn)的關(guān)鍵字”挣磨,而不是一種“用于聲明的關(guān)鍵字”。
2. 內(nèi)聯(lián)是以代碼膨脹(復(fù)制)為代價荤懂,僅僅省去了函數(shù)調(diào)用的開銷茁裙,從而提高函數(shù)的執(zhí)行效率。
mutable: 當類或者結(jié)構(gòu)體中的某個變量被mutable關(guān)鍵字修飾時节仿,即便這個結(jié)構(gòu)體或者類被實例化為const類型晤锥,其中被mutable修飾的變量仍可以被修改。
e.g.,
typedef struct test {
????mutable int iVal = 0;
}Test;
int main() {
????const Test t;
????t.iVal = 2;
}
register:?當對一個變量頻繁被讀寫時廊宪,需要反復(fù)訪問內(nèi)存矾瘾,從而花費大量的存取時間。為此箭启,C語言提供了一種變量壕翩,即寄存器變量。這種變量存放在CPU的寄存器中傅寡,使用時放妈,不需要訪問內(nèi)存,而直接從寄存器中讀寫荐操,從而提高效率芜抒。
注意: 1. 只有局部變量才可以定義為寄存器變量
? ? ? ? ? ? 2. 建議型關(guān)鍵字,同inline托启,實際編譯的時候可以并未成為寄存器變量宅倒。
reinterpret_cast:?
static:?
運行一個完整的程序。我們可將整個存儲區(qū)分為四塊:
(1)棧區(qū):就比如局部變量驾中,對應(yīng)的函數(shù)參數(shù)等這些唉堪,調(diào)用完之后相應(yīng)的內(nèi)存會自己釋放掉模聋,很讓人省心。
(2)堆區(qū):堆來堆去的唠亚。得要人動手链方。所以得我們自己手動去分配和釋放。像malloc(c),new(c++) 灶搜,delete 一下等等祟蚀。
(3)全局數(shù)據(jù)(靜態(tài)區(qū)):全局變量和靜態(tài)變量是放在一個窩里面的。靜態(tài)變量如果沒有初始化割卖,系統(tǒng)會自動初始化的前酿。雖然系統(tǒng)會自動初始化,但是分房間的時候還是得分清楚的鹏溯。所以最終是初始化的全局變量和初始化的靜態(tài)變量分在一塊區(qū)域罢维,即同一個房間。未初始化的全局變量和未初始化的靜態(tài)變量分在一塊丙挽。程序結(jié)束時釋放肺孵。
(4)最后就是代碼區(qū)了
static的用法:
(a)如果用static修飾局部函數(shù)的變量。那么這個變量就是靜態(tài)變量了颜阐。在主函數(shù)中平窘,如果重復(fù)調(diào)用這個函數(shù),那么里面的這個靜態(tài)變量只會初始化一次凳怨。如果沒有用static修飾瑰艘,那么每次調(diào)用的時候都會對這個變量進行初始化。
(b)如果用static修飾全局的變量肤舞。那么在這個文件中所有的函數(shù)都可以使用這個變量紫新。如果一個工程里面有a.c和b.c文件,static在a.c中定義的萨赁。那么b.c就用不了這個static修飾的變量弊琴。如果沒有static修飾,只要加一個extern外部調(diào)用聲明杖爽,就可以了敲董。
(c)如果用static修飾全局函數(shù),同上(b)慰安。
(d)static修飾類中的變量腋寨。用static修飾之后,那么這個變量的內(nèi)存就分配在了全局數(shù)據(jù)區(qū)了化焕,并不和該類在同一片區(qū)域萄窜。所以static只會被初始化一次。
(e)static修飾類中的函數(shù)。那么該函數(shù)就變成了靜態(tài)函數(shù)查刻。靜態(tài)函數(shù)不能訪問非靜態(tài)函數(shù)键兜,非靜態(tài)函數(shù)可以訪問靜態(tài)函數(shù)。訪問靜態(tài)函數(shù)可以用(.->)穗泵,指針或者類名::三種方式訪問普气。
static_cast:?
static_cast < type-id > ( expression )
該運算符把 expression 轉(zhuǎn)換為 type-id 類型,但沒有運行時類型檢查來保證轉(zhuǎn)換的安全性佃延。它主要有如下幾種用法:
① 用于類層次結(jié)構(gòu)中基類和子類之間指針或引用的轉(zhuǎn)換现诀。進行上行轉(zhuǎn)換(把子類的指針或引用轉(zhuǎn)換成基類表示)是安全的;進行下行轉(zhuǎn)換(把基類指針或引用轉(zhuǎn)換成子類表示)時履肃,由于沒有動態(tài)類型檢查仔沿,所以是不安全的。
② 用于基本數(shù)據(jù)類型之間的轉(zhuǎn)換尺棋,如把 int 轉(zhuǎn)換成 char封锉,把 int 轉(zhuǎn)換成 enum。這種轉(zhuǎn)換的安全性也要開發(fā)人員來保證膘螟。
③ 把空指針轉(zhuǎn)換成目標類型的空指針烘浦。
④ 把任何類型的表達式轉(zhuǎn)換成void類。
union:?不同的是 enum 實質(zhì)上是 int 類型的萍鲸,而 union 可以用于所有類型。
virtual:?基類的函數(shù)調(diào)用如果有virtual則根據(jù)多態(tài)性調(diào)用派生類的擦俐,如果沒有virtual則是正常的靜態(tài)函數(shù)調(diào)用脊阴,還是調(diào)用基類的。
純虛函數(shù):?virtual ostream& print( ostream&=cout ) const = 0;
包含一個或多個純虛擬函數(shù)的類被編譯器識別為抽象基類蚯瞧。抽象基類不能被實例化嘿期,一般用于繼承。抽象基類只能作為子對象出現(xiàn)在后續(xù)的派生類中
volatile:?用volatile聲明的變量表示該變量隨時可能發(fā)生變化埋合,與該變量有關(guān)的運算备徐,不要進行編譯優(yōu)化,以免出錯