C++学习笔记(二)
2016-05-19 11:11
405 查看
1.C++语言三特性:封装、继承、多态
2.引用类型
引用:变量的别名(变量不能只有别名)
引用作为函数参数
2.控制变量const
指针类型const形式的注意事项
const与引用
3.C++函数新特性
4.总结
函数参数默认值,实参覆盖默认值
函数重载,名称相同参数可变
内联函数,inline 效率高 有条件
5.C++内存管理
内存的本质是操作系统掌控的资源,所谓管理内存便是资源的申请或管理
2.引用类型
引用:变量的别名(变量不能只有别名)
基本数据类型的引用 #include<stdlib.h> #include<iostream> using namespace std; int main(void){ int a = 3; int &b = a; // 引用的初始化且必须 b = 10; // 对别名的任何操作都是对变量本身的操作 cout<<a<<endl; return 0; } // 结构体类型的引用 #include<stdlib.h> #include<iostream> using namespace std; typedef struct{ int x; int y; }Coor; int main(void){ Coor c1; Coor &c = c1; c.x = 10; c.y = 20; cout<<c1.x<<c1.y; return 0; } // 指针类型的引用 类型 *&指针引用名 = 指针 #include<stdlib.h> #include<iostream> using namespace std; int main(void){ int a = 10; int *p = &a; int *&q = p; *q = 20; cout<<a<<endl; return 0; }
引用作为函数参数
// 没有学习引用前 void fun(int *a,int *b){ int c = 0; c = *a; *a = *b; *b = c; } int x = 10,y = 20; fun (&x,&y); // 引用作为函数参数 void fun(int &a,int &y){ int c = 0; c = a; a = b; b = c; } int x = 10,y = 20; fun(x,y);
2.控制变量const
// const与基本数据类型的关系 const int a = 3; //a为值3得常量,不可更改 // const与指针类型 const int *p = NULL; int const *p = NULL; //二者完全等价 int *const p = NULL; //与前两者完全不同 // 指针类型可以添加两处const const int *const p = NULL; int const * const p = NULL; // 二者完全等价
指针类型const形式的注意事项
int x = 3;const int *P = &x; // p = &y;正确 // *p = 4;错误 // const修饰*P,修改*p的值是错误的 int x = 3;int *const p = &x; //p = &y;错误 //const此时修饰p,修改p的指向是错误的 const int x = 3;const int *const p = &x; //p = &y;*p = 4;都是错误的 //此时const修饰p和*p,改变p指向或修改8P的值都是错误的
const与引用
int x = 3; const int &y = x; //x = 10;正确 //y = 20;错误 //此时const修饰引用y,修改y的值是错误的 const int x = 3;int *y = &x; // 用可变的指针指向不可变的变量,此时可以通过改变指针指向修改x的值,风险太大被计算机禁止 int x = 3;const int *y = &x; // 指针是静态的,只允许读,x是变量允许读写,计算机允许用权限较小的量承接权限较大的量
3.C++函数新特性
// 函数参数默认值 void fun(int i,int j = 5,int k = 6); void fun(int i,int j = 5,int k );// 错误 // 有默认值的参数必须在参数列表的最右端 void fun(int i,int j = 5,int k = 10);//函数声明,此时可加默认值 void fun(int i,int j,int k){ //函数定义时不加默认值 cout<<i<<j<<k; } fun(20); fun(20,30); fun(20,30,40); //无实参则用默认值,否则实参覆盖默认值 //函数重载 //在相同作用域下,同一函数名定义多个函数 //彼此的参数个数或参数类型不同 int getMax(int x,int y,int z){ //to do } double getMax(double x,double y){ //to do } //内联函数 // 编译时将函数体代码和实参替代函数调用语句,节省调用过程的时间 // 内联函数关键字 inline inline int max(int a,int b,int c); int main(){ int i = 10,j = 20,k = 30,m; m = max(i,j,k); cout<<"max="<<m<<endl; return 0; } // 内联编译是建议的,由编译器决定 // 需要逻辑简单,不可有循环等,大量调用时建议使用内联 // 递归函数无法成为内联函数
4.总结
函数参数默认值,实参覆盖默认值
函数重载,名称相同参数可变
内联函数,inline 效率高 有条件
5.C++内存管理
内存的本质是操作系统掌控的资源,所谓管理内存便是资源的申请或管理
// 申请内存 new; // 归还内存 delete; int *p = new int;// 申请内存 delete p;// 归还内存 //申请和释放块内存 int *arr = new int[10]; delete []arr; //内存操作的注意事项 //malloc与free、new与delete搭配使用 int *p = new int[1000]; if (p = NULL){ //事情内存失败 } delete []p; p = NULL; //回收内存时将指针定义为空 //内存管理实例 #include<stdlib.h> #include<iostream> using namespace std; int main(void){ int *p = new int; if (NULL == P){ system("pause"); return 0; } *p = 20; cout<<*p<<endl; delete p; p = NULL; system("pause"); return 0; } #include<stdlib.h> #include<iostream> using namespace std; int main(void){ int *p = new int[1000]; if (NULL == p){ system("pause"); return 0; } p[0] = 10; p[1] = 20; cout<<p[0]<<p[1]<<endl; delete []p; p = NULL; system("pause"); return 0; }