1.#inclue
#inclue中的 # 是預處理標誌,要最先處理,即在編譯器編譯**之前執行
#inclue<> 和 #include 「」 的區別:
< >引用的是編譯器的類庫路徑裡面的標頭檔案
" "引用的是你程式目錄的相對路徑中的標頭檔案
< >一般是引用自帶的一些標頭檔案:stdio.h、conio.h、string.h、stdlib.h等等之類的
" "一般是用來引用自己寫的一些標頭檔案
如果使用" ",會先在你專案的當前目錄查詢是否有對應標頭檔案
如果沒有,它還是會在對應的類庫路徑目錄裡面查詢對應的標頭檔案
2.iostream是乙個標準庫,裡面包含了cin和cout,用法就是std::cout<<"hello";
int x;
std:cin>>x;
還可以這樣:
int a,b,c;
std::cin>>a>>b>>c;
std::cout《是標頭檔案。//注意iostream.h
cout,cin,endl是在std命名空間中定義的物件。
4.c++中cout定義在命名空間std中,因此,在使用cout時可以用std::cout這樣的方式使用,需要注意的是,cout是ostream型別的物件,而ostream型別定義在iostream標頭檔案中,因此,在使用cout時,還需要使用#include. 總結:c++中的命名空間和c#中的意思基本一樣,也是相同的作用,用法也差不多,c++中的std是包含了所有的識別符號的命名空間,所以一般都要using std,當然也可以直接std::cout 這樣呼叫。
5.system("pause");是暫停的意思,在main函式最後可以不讓控制台關閉,用ctrl+f5也不會關閉,f5除錯的話又不加system("pause")的話就會自動關閉。
6.#include "stdafx.h" ???
7.#include和的區別:
#include中的iostream是c++標準標頭檔案庫,而#include是c中的標頭檔案庫,因為c++繼承了c的特性,所以也保留了iostream.h這種寫法,因為c++引入了namespace,所以用iostream的時候就要開闢命名空間,例如:
#include
using namespace std;
用iostream.h的時候就不用命名空間;
8.c++的編譯器是從上到下的,例如這段**
int _tmain()
void swap1(int& a, int& b)//按引用傳遞
void swap2(int *a, int *b)//按位址傳遞
int main()
21.c++為什麼要產生副本?通過彙編理解指標,學習彙編。。
22.棧區和堆區
1.棧區:由編譯器自動分配並且自動釋放,一般是函式引數和區域性變數
2.堆區:一般有程式設計師分配釋放,若不釋放,則程式結束時由系統釋放
堆是有一串不連續的鍊錶串聯起來的記憶體,速度較慢,容易產生記憶體碎片,容易使用,在申請記憶體的時候,系統會遍歷乙個空閒位址的鍊錶,找到合適的位址分配給使用者
棧是系統自動分配的,程式設計師不能操作,而且一般較小,一般是函式引數或者區域性變數,當函式結束時會釋放,棧中的記憶體是先進後出的。一般第乙個進棧的是函式下一行的記憶體位址,然後從右到左的函式引數,然後是變數,出棧時完全相反,所有變數出棧之後就剩函式下一行的記憶體位址了,然後自動跳轉到下一行執行!
23.記憶體的三種分配方式:
1. 從靜態儲存區分配:此時的內存在程式編譯的時候已經分配好,並且在程式的整個執行期間都存在。全域性變數,static變數等在此儲存。
2. 在棧區分配:相關**執行時建立,執行結束時被自動釋放。區域性變數在此儲存。棧記憶體分配運算內置於處理器的指令集中,效率高,但容量有限。
3. 在堆區分配:動態分配記憶體。用new/malloc時開闢,delete/free時釋放。生存期由使用者指定,靈活。但有記憶體洩露等問題。
24.類的初始化,用new和不用new的區別:
通過下面這個例子,會輸出「釋放1」,我們可以得出在不使用new建立物件時,物件的記憶體空間是在棧中的,其作用範圍只是在函式內部,函式執行完成後就會呼叫析構函式,刪除該物件。而使用new建立物件是建立在堆中的,必須要程式設計師手動的去管理該物件的記憶體空間
#includeclass testnew
;testnew::testnew(int id)
testnew::~testnew()
void test()
int main()
25.int *p=new int; 在堆中new乙個int型 即4位元組的記憶體空間,記憶體位址儲存在p中
*p=3, 修改這塊記憶體中存放的值,改為3
delete p; 釋放這塊記憶體空間,但是並沒有釋放p,p指標還能繼續使用,
p=0; 一般是將p清0,以免錯誤
p=new int; p還能繼續使用
*p=400; 修改這塊記憶體中存放的值,改為400
26.記憶體洩漏:因為new在堆中的記憶體不會自動釋放,假如儲存這塊記憶體的指標是乙個函式中的區域性變數,當函式執行完畢後,會釋放這個指標,那麼這塊記憶體就象消失了一樣,再也找不回來了,這就叫記憶體洩漏,必須對這個指標使用delete
27.常見記憶體錯誤及對策
1. 記憶體分配未成功,卻被使用。
對策:使用記憶體之前檢查是否分配成功。用p!=null判斷。
2. 記憶體分配成功,未初始化就被使用。
記憶體的預設值沒有統一的標準。大部分編譯器以0作為初始值,但不完全是。
對策:記憶體初始化時賦初值。
3. 記憶體操作越界。
對策:只能是小心了。
4. 釋放了記憶體,仍然使用。
(1) 使用顯示delete和free的野指標。
對策:釋放完記憶體,將指標置為null。
(2) 使用隱式delete和free的野指標。主要是指函式返回指向棧記憶體的指標或引用。
對策:當然是不要返回就可以了。
5. 未釋放記憶體,導致記憶體洩露。
用new/malloc開闢了記憶體,沒用delete/free釋放.
對策:new和delete的個數一定相同;malloc和free的個數一定相同;new和delete一定對應
28.指標能加減能比較大小
29.將指標定義為常量指標 int *const p=&a; p是乙個常量指標,p本身的值無法修改,但是它指向的位址可以修改
30.假如把const放在前面 const int *p=&a; p是指向常量的指標,p本身可以修改,但是p所指向的目標不能修改
31.函式的成員變數的初始化
class a
{public:
a():x(4),y(7) //這是一種成員變數的初始化寫法,會輸出28
{cout《如果把x定義為const的話,就只能使用這種寫法給成員變數初始化,因為常量和引用只能被初始化不能被賦值。
C 基礎知識問答 一
1.靜態變數與非靜態變數的區別 靜態變數在類載入的時候進行初始化和分配記憶體,只有乙個例項。通過類來進行訪問。而非靜態變數是在物件在例項化的時候進行分配記憶體,有多個例項。通過物件來進行訪問。同乙個非靜態變數,多個例項中的值是不同。另外加一句,靜態函式成員不能訪問非靜態成員,如非靜態變數,非靜態函式...
C 基礎知識之一
c 基礎知識之一 1 型別 13種預定義簡單型別,2種預定義非簡單型別object string 6種使用者自定義型別class struct array enum delegate inte ce.13種預定義簡單型別細分為 非資料型別2種 bool char 數值型別11種 整數型別8種 sby...
c 基礎知識整理(一)
一 標頭檔案 1 define保護 為防止標頭檔案被多重包含,檔案的格式應該為 h 這樣寫是為了保證其唯一性 2 內聯函式 在編譯的時候,編譯器會將它自動展開 所以合理的使用內聯函式會提高效率 內聯函式一般都是短小的,但要除for,while這類的。有些函式即使不加了inline 也不一定會變成內聯...