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; }