首页 > 代码库 > C++基础 易忘
C++基础 易忘
1.const 修饰符:C语言中习惯用#define来定义常量,例如#define PI 3.14
C++提供了一种更加安全(这里的安全是指在替换的时候#define可能出错),更灵活的方式定义常量,用const修饰符,如:const float PI=3.14;这个常量 PI 是类型化的,它有地址,可以用指针指向它,但是不修改它(因此C++推荐使用const)。
(1).指向常量的指针:如,const char* p="abc";注意,这里指针p的值可以改变,但是不能改变p指向的常量的值。p[2]=‘x‘;//错误
p=‘cdf‘;//正确
(2).常指针:如,char* const p=‘abc‘;注意,这里不能改变指针指向的地址,但是地址中的数据是可以改变的。p[2]=‘x‘;//正确
p=‘cdf‘;//错误
(3).指向常量的常指针:如,const char* const p=‘abc‘;这里指针指向的地址和地址中的数据都不能改。p[2]=‘x‘;//错误
p=‘cdf‘;//错误
说明:1.常量一旦建立,在程序的任何地方都不能改变。2.与#define不同,const可以有自己的数据类型,编译时具有良好的检测性。3.函数参数可以用 const修饰,用于保证实参在该函数内部不能被改动。即对实参,只读不写;如希望通过i_Max求出整型数组a[200]的最大值,可以定义函数原型:
int i_Max(const int* ptr);调用的格式可以使:i_Max(a);
2.void型指针:void通常表示无值,但将void作为指针的类型时,它却表示不确定的类型。这种void型指针式一种通用型指针,也就是说任何类型的指针值都可 以赋值给void类型的指针变量。
void *p; //声明void 型指针
int i=256;
p=&i;
注意,对于已经获值了void型指针,再对它进行操作的话,一定要显示的类型转换。否则出错!
...
cout<<* (int* ) p<<endl;
...
3.内联函数inline:以空间换时间,所以,通常只有规模很小的且频繁使用的函数才定义为内联函数。与宏#define相似,但完全相同,推荐使用内联函数,更安 全;
(1).类的成员函数如果定义在类里面,默认为内联函数,定义在类外的成员函数,只有加inline修饰才是内联函数;
(2).内联函数可以在程序中定义多次,只要内联函数在一个.cpp文件中只出现一次,并且在所有的.cpp文 件中,这个内联函数的定义是一样的,就能通过编 译。那么显然,把内联函数的定义放进一个头文件中是非常明智的做法。(这句话转自 http://www.cnblogs.com/lidabo/archive/2012/04/17/2454568.html
4.函数重载:
(1)调用函数重载时,函数返回值类型不在参数检查之列,故而只有返回值类型不同,不允许重载,出错!
(2)函数重载与带默认值得函数一起使用的时候,有可能引起二义性,出错!如:
void fun(int r=0,int x=0);
void fun(int r);
当调用fun(20)出错,无法识别是调用哪个函数,可以看出,函数重载需要注意不要产生二义性!
5.new和delete:
C语言提供了malloc和free进行动态内存管理,C++提供了运算符new和delete做同样的工作,后者更出色,推荐后者!
基本形式: 指针变量名=new 类型;delete 指针变量名;如,
int *p;
p=new int;
delete p;
对于数组,语法形式为:指针变量名=new 类型名[下标表达式];delete []指针变量名;
int *p=new int[10];
int *pr=new int[2][3];
delete []p;
delete []pr;
说明:1.运算符new可以自动计算所要分配的内存大小,不必用sizeof(),减少出错。2.new能自动返回正确的指针类型,不必进行强制类型转换。3.但是 new和delete要成对使用,否则new申请的空间变为死空间!4.一般使用new时要进行检查是否分配内存成功,不成功则new返回空指针NULL(养成一个好习
惯);
6.引用:
概念:引用是C++对于C的一个重要的补充,C++中变量的“引用”就是变量的别名,对引用进行的操作就是对变量进行的操作,二者等价!因此有时候引用
比起指针更加清晰简单。
格式:类型 &引用名=已定义的变量名;//这里的&不代表取址,表示引用。
int a=5;
int &b=a;
那么b就是a的引用,a和b代表同一个变量,共享同一个内存单元!
C++基础 易忘