int (*pf)(int , char); //pf爲一個函數指針,它所指向的函數的返回值是int,2個參數一個是int類型一個是char類型
#include <stdio.h> void PrintMin(int a, int b) { if(a < b) printf("%d",a); else printf("%d",b); } int main() { void(* pf)(int, int); int x = 4, y = 5; pf = PrintMin; pf(x,y); return 0; } //pf指針指向PrintMin
void qsort(void *base, int nelem, unsigned int width, int(* pfCompare)(const void*,const void*)); //base:待排序數組的起始地址 //nelem:待排序數組的元素個數 //width:待排序數組的每一個元素的大小(以字節爲單位) //pfCompare:比較函數的地址 //pfCompare:函數指針,它指向一個「比較函數」,該比較函數的形式以下 //int 函數名 (const void * elem1,const void * elem2); //比較函數是程序員本身編寫的
#include <stdio.h> #include <stdlib.h> int MyCompare(const void * elem1,const void * elem2) { unsigned int * p1, * p2; p1 = (unsigned int *) elem1; //"*elem1" 非法,編譯器不知道void指針指向的元素有多少個字節 p2 = (unsigned int *) elem2; //"*elem2" 同上 return (*p1 % 10) - (*p2 % 10); } #define NUM 5 int main() { unsigned int an[NUM] = (8,123,11,10,4); qsort(an,NUM,sizeof(unsigned int),MyCompare); for(int i=0;i<NUM;i++) printf("%d",an[i]); return 0; }
int main(int argc, char * argv[]) { ... }
將參與運算的兩數,各對應的二進制位進行與操做,只有對應的兩個二進制位均爲1時,結果對應的二進制位才爲1,不然爲0ios
一般用來將某變量中的某些位清0切同時保留其餘位不變,也可用來獲取某變量中的某一位程序員
int a = 5, b = 7; a = a ^ b; b = b ^ a; a = a ^ b;
下面的寫法定義了一個引用,並將其初始化爲引用某個變量算法
類型名 & 引用名 = 某變量名編程
int n = 4; int & r = n; //r引用了n,r的類型是int &
某個變量的引用,等價於這個變量,至關於該變量的一個別名數組
定義引用時必定要將其初始化成引用某個變量數據結構
初始化後,他就一直引用該變量,不會再引用別的變量了數據結構和算法
引用只能引用變量,不能引用常量和表達式模塊化
void swap(int a, int b) { int tmp; tmp = a; a = b; b = tmp; } int n1,n2; swap(n1,n2); //n1n2的值不會被交換,形參的改變沒法影響實參 void swap(int *a,int *b) { int tmp; tmp = *a; *a = *b; *b = tmp; } int n1,n2; swap(&n1,&n2); //n1n2的值被交換,可是多了不少符號,比較麻煩
void swap(int &a, int &b) { int tmp; tmp = a; a = b; b = tmp; } int n1,n2; swap(n1,n2); //n1n2的值被交換,因爲a和b是n1和n2的引用,於是能夠直接修改
int n = 4; int & SetValue() {return n;} int main() { SetValue() = 40; //函數的返回值是引用,就能夠把函數寫在等號左邊,能夠直接賦值 cout<<n;//輸出:40 return 0; }
int n; const int & r = n; //r的類型是const int &
const int MAX_VAL = 23; const double Pi = 3.14;
int n,m; const int *p = &n; *p = 5; //編譯錯誤 n = 4; //正確 p = &m; //正確,能夠改變常量指針指向的對象
const int * p1; int * p2; p1 = p2;//正確 p2 = p1;//錯誤 p2 = (int *)p1;//正確,經過強制類型轉換
void MyPrintf(const char *p) { strcpy(p,"this");//編譯錯誤 printf("%s",p);//正確 }
int n; const int & r = n; r = 5;//編譯錯誤 n = 4;//正確
int *pn; pn = new int; *pn = 5;
int *pn; int i = 5; pn = new int[i * 20]; pn[0] = 20; pn[100] = 30;//雖然編譯正確,但運行時會出現數組越界
int *p = new int; *p = 5; delete p; delete p; //致使異常,一片空間不可以被delete屢次
int *p = new int[20]; p[0] = 1; delete [] p;
函數調用存在時間開銷。若是函數自己只有幾條語句且執行很是快,並且函數被反覆執行屢次,相比其運行時間,調用函數所產生的時間開銷就會很大。函數
爲了減小該開銷,引入了內聯函數機制。編譯器處理對內聯函數的調用語句時,是將整個函數的代碼插入到調用語句處,而不會產生調用函數的語句。ui
在函數定義前面加「inline」關鍵字,便可定義內聯函數
缺點是可執行程序的體積會增大
一個或多個函數,名字相同,然而參數個數或參數類型不相同,這叫作函數重載
如下三個函數是重載關係:
int Max(double f1,double f2){ } int Max(int n1,int n2){ } int Max(int n1,int n2,int n3){ }
函數重載簡化函數命名
編譯器根據調用語句中的實參的個數和類型判斷應該調用哪一個函數
void func(int x1, int x2 = 2, int x3 = 3){ } func(10);//等效於func(10,2,3) func(10,8);//等效於func(10,8,3) func(10,,8);//編譯錯誤,只能最右邊的連續若干個參數缺省
第一個面嚮對象語言:Simula
第二個面嚮對象語言:Smalltalk
1983年 C++
1995年 JAVA
2003年 C#
class CRectangle{ public: int w,h; void Init(int w_, int h_) { w = w_; h = h_; } int Area() { return w*h; } int Perimeter() { return 2*(w+h); } }; int main() { int w,h; CRectangle r; //r是一個對象 cin>>w>>h; r.Init(w,h); cout<<r.Area()<<endl<<r.Perimeter(); return 0; }
對象的內存分配
對象間的運算
訪問類的成員變量和成員函數
類的成員函數的另外一種寫法
#include<iostream> #include<stdio.h> #include<cstring> #include<string> #include<string.h> //雖然我本地編譯用最上面那個頭文件就過了,但上傳上去好像必需要加上後面這四個才能經過……行吧 using namespace std; class student{ private: char name[10]; int age; char number[10]; unsigned int gradeAverage; public: void gradeCalculate(unsigned int a,unsigned int b,unsigned int c,unsigned int d) { gradeAverage = (a+b+c+d)/4; } student(const char* name_, int age_, const char* number_) { strcpy(name,name_); age = age_; strcpy(number,number_); } void getAll() { cout << name <<',' << age << ',' << number << ',' << gradeAverage << endl; } }; int main() { char name[10] = {'\0'},number[10] = {'\0'}; int age; unsigned int grade1,grade2,grade3,grade4; //此處的cin.get()用於把逗號吞掉 cin.getline(name,10,','); cin >> age; cin.get(); cin.getline(number,10,','); cin >> grade1; cin.get(); cin>> grade2; cin.get(); cin >> grade3; cin.get(); cin >> grade4; student* a = new student(name,age,number); a->gradeCalculate(grade1,grade2,grade3,grade4); a->getAll(); delete(a); return 0; }