答: c和c++中struct的主要區別是c中的struct不可以含有成員函式,而c++中的struct可以。c++中struct和class的主要區別在於預設的訪問許可權不同,struct預設為public,而class預設為private;其次,c++中的類具有成員保護功能,並且具有繼承,多型這類oo特點,而struct沒有.
const char*, char const*, char*const的區別問題幾乎是c++面試中每次 都會有的題目。 事實上這個概念誰都有只是三種宣告方式非常相似很容易記混。 bjarne在他的the c++ programming language裡面給出過乙個助記的方法: 把乙個宣告從右向左讀。
char * const cp; ( * 讀成 pointer to )
cp is a const pointer to char
const char * p;
p is a pointer to const char;
char const * p;
同上因為c++裡面沒有const*的運算子,所以const只能屬於前面的型別
int *p[n];-----指標陣列,每個元素均為指向整型資料的指標。
int (*p)[n];------p為指向一維陣列的指標,這個一維陣列有n個整型資料。
int *p();----------函式帶回指標,指標指向返回的值。
int (*p)();------p為指向函式的指標。
答:#include "memory.h"
memset用來對一段記憶體空間全部設定為某個字元,一般用在對定義的字串進行初始化為' '或'';例:char a[100];memset(a, '', sizeof(a));
memcpy用來做記憶體拷貝,你可以拿它拷貝任何資料型別的物件,可以指定拷貝的資料長度;例:char a[100],b[50]; memcpy(b, a, sizeof(b));注意如用sizeof(a),會造成b的記憶體位址溢位。
strcpy就只能拷貝字串了,它遇到'\0'就結束拷貝;例:char a[100],b[50];strcpy(a,b);如用strcpy(b,a),要注意a中的字串長度(第乙個'\0'之前)是否超過50位,如超過,則會造成b的記憶體位址溢位。
strcpy
原型:extern char *strcpy(char *dest,char *src);
assert((dest!=null)&&(src!=null));
char *address = dest;
while((*dest++=*src++)!=』\0』)
continue;
return dest;
用法:#include
功能:把src所指由null結束的字串複製到dest所指的陣列中。
說明:src和dest所指記憶體區域不可以重疊且dest必須有足夠的空間來容納src的字串。
返回指向dest的指標。
memcpy
原型:extern void *memcpy(void *dest, void *src, unsigned int count);
assert((dest!=null)&&(src!=null));
assert((dest>src+count)||(src>dest+count));//防止記憶體重疊,也可以用restrict修飾指標
byte* bdest = (byte*)dest;
byte* bsrc = (byte*) src;
while(count-->0)
*bdest++ = **bsrc++;
return dest;
用法:#include
功能:由src所指記憶體區域複製count個位元組到dest所指記憶體區域。
說明:src和dest所指記憶體區域不能重疊,函式返回指向dest的指標。
memset
原型:extern void *memset(void *buffer, char c, int count);
用法:#include
功能:把buffer所指記憶體區域的前count個位元組設定成字元c。
說明:返回指向buffer的指標。
delete會呼叫物件的析構函式,和new對應free只會釋放記憶體,new呼叫建構函式。malloc與free是c++/c語言的標準庫函式,new/delete是c++的運算子。它們都可用於申請動態記憶體和釋放記憶體。對於非內部資料型別的物件而言,光用maloc/free無法滿足動態物件的要求。物件在建立的同時要自動執行建構函式,物件在消亡之前要自動執行析構函式。由於malloc/free是庫函式而不是運算子,不在編譯器控制許可權之內,不能夠把執行建構函式和析構函式的任務強加於malloc/free。因此c++語言需要乙個能完成動態記憶體分配和初始化工作的運算子new,以及乙個能完成清理與釋放記憶體工作的運算子delete。注意new/delete不是庫函式。
c++在建立物件的時候可以採用兩種方式:(例如類名為test) test test 或者 test* ptest = new test()。
這兩種方法都可以例項化乙個物件,但是這兩種方法有很大的區別,區別在於物件內容所在的記憶體空間不同,眾所周知(或專題一,關於記憶體分配),記憶體的分配方式有三種
(1)從靜態儲存區域分配。內存在程式編譯的時候就已經分配好,這塊內存在程式的整個執行期間都存在。例如全域性變數,static 變數。
(2) 在棧上建立。在執行函式時,函式內區域性變數的儲存單元都可以在棧上建立,函式執行結束後在將這些區域性變數的記憶體空間**。在棧上分配記憶體空間效率很高,但是分配的記憶體容量有限。
(3) 從堆上分配的。程式在執行的時候用 malloc 或 new 申請任意多少的記憶體,程式設計師自己負責在何時用 free 或 delete 釋放記憶體。
不使用new建立物件時,物件的記憶體空間是在棧中的,其作用範圍只是在函式內部,函式執行完成後就會呼叫析構函式,刪除該物件。
而使用new建立物件是建立在堆中的,必須要程式設計師手動的去管理該物件的記憶體空間
多型:是對於不同物件接收相同訊息時產生不同的動作。
c++的多型性具體體現在執行和編譯兩個方面:
在程式編譯時多型性體現在函式和運算子的過載上;
在程式執行時的多型性通過繼承和虛函式來體現;
虛函式:在基類中冠以關鍵字 virtual 的成員函式。 它提供了一種介面介面。允許在派生類中對基類的虛函式重新定義。
純虛函式的作用:在基類中為其派生類保留乙個函式的名字,以便派生類根據需要對它進行定義。作為介面而存在 純虛函式不具 備函式的功能,一般不能直接被呼叫。
從基類繼承來的純虛函式,在派生類中仍是虛函式。如果乙個類中至少有乙個純虛函式,那麼這個類被稱為抽象類(abstract class)。
抽象類中不僅包括純虛函式,也可包括虛函式。抽象類必須用作派生其他類的基類,而不能用於直接建立物件例項。但仍可使用指向抽象類的指標支援執行時多型性。
用於數值型別之間的轉換,也可以用於指標之間的轉換,編譯時已經確定好,效率高,但需要保證其安全性。
a) 指標要先轉換成void才能繼續往下轉換。
b) 在基類和派生類之間進行轉換(必須有繼承關係的兩個類)
子類物件可以轉為基類物件(安全),基類物件不能轉為子類物件(可以轉換,但不安全,dynamic_cast可以實現安全的向下轉換)。
static_cast不能轉換掉expression的const、volatile、或者__unaligned屬性
只能用於物件的指標和引用之間的轉換,需要虛函式。
dynamic_cast會檢查轉換是否會返回乙個被請求的有效的完整物件,否則返回null;
type-id必須是類的指標、類的引用或者void *,用於將基類的指標或引用安全地轉換成派生類的指標或引用。
這個轉換型別操縱傳遞物件的const屬性,或者是設定或者是移除。
用在任意指標型別之間的轉換;以及指標與足夠大的整數型別之間的轉換,從整數到指標,無視大小。
9.怎麼處理父類中的同名函式)
正常基於多繼承,子類會隱藏父類中的同名函式;也可以強行呼叫 類名::成員函式();
CC 查漏補缺
培養個人才能,無可替代,確定個人職業目標,專業技術性人才,自主學速度習,提公升專業能力,打字速度是基本功,多加練習,實現盲打,提高準確度,速度,練習時間,3個月,每天1小時,專業書籍閱讀,不要期待別人一句句教你都很忙,沒時間搭理你。解決年齡焦慮,最好的辦法是行動,明確目標,腳踏實地。完善個人知識體系...
查漏補缺 二
map 和 unordered map 執行緒安全 靜態成員變數儲存在全域性區,屬於類本身 靜態成員函式 和 非靜態成員函式都儲存在 區,都是所有類物件共有的.可以通過類直接呼叫靜態成員函式,但是非靜態成員函式 包含乙個 指向類物件的指標 this指標 只有類物件才能呼叫.預設拷貝建構函式 和 賦值...
20190918 查漏補缺 二
1.int swap 的含義 乙個返回整型值指標的函式。2.夏農公式 c w 1 log2 snr bps 或 bit s 3.c語言的源程式變為可執行檔案的三個階段 預處理階段 由預處理器對巨集定義進行展開 編譯階段 由編譯器對預處理後的程式進行編譯,生成目標檔案 4.奈奎斯特取樣定理 取樣頻率不...