c++ 程式設計學習筆記
函式指標
程式執行期間,每個函式都會佔用一段連續的記憶體空間。而函式名就是該函式所佔記憶體區域的起始地址(入口地址)。我們可以將函式的入口地址賦給一個指標變數,使該變數指向該函式。然後通過指標變數就可以呼叫這個函式。這種指向函式的指標變數稱為函式指標。
#include <iostream> #include <vector> #include <sys/stat.h> #include <unistd.h> #include <string> #include <fstream> #include <cstddef> void print_smaller(int a,int b) { std::cout << ((a < b) ? a:b )<< std::endl; } int main() { /*等價於 void (*fn)(int ,int ) = print_smaller;*/ void (*fn)(int ,int ); fn = print_smaller; fn(3,4); return 0; }
命令列引數
#include <stdio.h> int main(int argc,char *argv[]) { for(int i = 0;i < argc;i++) printf("%s\n",argv[i]); return 0; }
命令列引數這部分有個知識點就是說如果引數中帶有空格,可以使用雙引號括起來。
例如./example hello world "hello world" 程式輸出./example hello world hello world
右移運算子
實際上右移n位就相當於左運算元除以2的n次方,並且將結果往小裡取整,例如:
-25 >> 4 = -2 -2 >> 4 = -1 18 >> 4 = 1
對於有符號數,如long,int,short,char型別變數,在右移時,符號位(即最高位)將一起移動,並且大多數C/C++編譯器規定,如果原符號位為1,則右移時高位就補充1,原符號為0,則右移時高位就補充0。
引用作為函式的返回值
int n = 4; int & SetVaule(){return n;} int main() { SetValue() = 40; cout << n; return 0; }//輸出40
常引用
不能通過常引用去修改其引用的內容。
int n = 100; const int & r = n; r = 200;//編譯報錯 n = 300;//沒問題,不能通過常引用去修改其引用的內容,但沒有限制通過其它方式修改n的內容
常量指標
不能把常量指標賦值給非常量指標。
可以把非常量指標賦值給常量指標。
原因如下:
定義常量指標的初衷是不能通過常量指標修改其指向的內容。如果把常量指標賦值給非常量指標,就可以通過非常量指標修改常量指標指向的內容。函式引數為常量指標時,可避免函式內部不小心改變引數指標所指地方的內容
void MyPrintf(const char *p) { //strcpy函式原形第一個引數為char*,由於不能將常量指標賦值給非常量指標,因此編譯報錯 strcpy(p,"this");//編譯出錯 printf("%s",p); }
用new運算子實現動態記憶體分配
new T;
new T[n];
這兩個表示式返回值的型別都是T*行內函數
函式呼叫是有開銷的。如果函式本身只有幾條語句,執行非常快,而且函式被反覆執行很多次,相比之下呼叫函式所產生的這個開銷就會顯得比較大。
為了減少函式呼叫的開銷,引入了行內函數機制。編譯器處理對行內函數的呼叫語句時,是將整個函式的程式碼插入到呼叫語句處,而不會產生呼叫函式的語句。
在函式定義前面加inline關鍵字,即可定義行內函數。函式過載
一個或多個函式,名字相同,然而引數個數或者引數型別不相同,這叫做函式的過載。函式名字相同,引數相同,僅返回值不同,不是函式過載,而是重複定義。
好處:函式過載使得函式命名變得簡單。
編譯器根據呼叫語句中的實參的個數和型別判斷應該呼叫哪個函式。函式預設引數
C++中定義函式的時候可以讓最右邊的連續若干個引數有預設值,那麼呼叫函式的時候,若相應位置不寫引數,引數就是預設值。
函式引數可預設的目的在於提高程式的可擴充性。
如果某個寫好的函式要新增新的引數,而原先那些呼叫該函式的語句,未必需要使用新增的引數,那麼為了避免對原先那些函式呼叫語句的修改,就可以使用預設引數。物件的記憶體分配
物件的記憶體空間
物件的大小=所有成員變數的大小之和
一個物件的某個成員變數被改變,不會影響到其他的物件。
物件之間可以用=進行賦值,不能使用== != > < >= <=
進行比較,除非這些運算子經過了過載。
#include <iostream> using namespace std; class CRectangle{ public: int w; int h; void Init(int w_,int h_); int Area(); int Perimeter(); }; voidCRectangle::Init(int w_,int h_){ w = w_; h = h_; } int CRectangle::Area(){ return w*h; } int CRectangle::Perimeter(){ return 2*(w + h); } int main() { int w,h; CRectangle r; cin>>w>>h; r.Init(w,h); cout<<r.Area()<<endl<<r.Perimeter()<<endl; return 0; }
類成員的可訪問範圍
關鍵字--類成員可被訪問的範圍
private:指定私有成員,只能在成員函式內被訪問,設定私有成員的目的是強制對成員變數的的訪問一定要通過成員函式進行。
public:指定公有成員,可以在任何地方被訪問
protected:指定保護成員
三種關鍵字出現的次數和先後順序都沒有限制
預設為私有成員
例如:class Man{ int nAge;//私有成員 char szName[20];//私有成員 public: void SetName(char *Name){ strcpy(szName,Name); } };
行內函數
定義方法:
inline + 成員函式
整個函式體出現在類定義內部
例如:class B{ inline void func1(); void func2() { } }; void B::func2() { }