一、C++的特点:
C++对C的“增强”,表现有两个方面:
(1).在原来的面向过程的机制基础上,对C语言的功能做了不少扩充。
(2).增加了面向对象的机制。
二、C++与C的简单区别:
(1).在C++程序中一般习惯在主函数main前面加一个类型声明符void,表示main函数没有返回值。
(2).除了可以用/*……*/形式的注释行外,还允许使用以//开头的注释。//为单行注释。
(3).除了可以用printf函数输出信息外,还可以用cout进行输出。cout要与运算符<<配合使用,程序中cout的作用是将<<运算符右侧的内容送到输出设备中输出。
(4).使用cout需要用到头文件iostream.h,在程序的第一行用#include命令将该头文件“包含”进来。
三、C++输入输出:
C++输入输出需要用到头文件“iostream.h”。
在C语言中文件不是由记录构成的,对文件的存取是以字节为单位的,对一个C文件的输入和输出是一个字节流。输入和输出的数据流的开始和结束只受程序控制而不受物理符号(如回车换行符)的控制,这种文件称为流式文件。
(1).用cout进行输出,cout必须与输出运算符<<一起使用。从屏幕上标准输出。
(2).用cin进行输入,cin必须与提取运算符>>一起使用。从键盘上标准输入。其中>>常称为“提取运算符”。输入的操作称为:“提取”(extracting)或“得到”(getting)。
(3).用cerr从屏幕标准出错输出。
(4).用clog从屏幕作cerr的缓冲形式。
四、函数的重载:
允许一个运算符用于不同场合,有不同的含义,这就叫运算符的“重载”(overloading),即重新赋予它新的含义,其实就是“一物多用”。
C语言规定在同一作用域(如同一文件模块中)中不能有同名的函数,所以C语言不支持函数重载。
C++允许在同一作用域中用同一函数名定义多个函数,这些函数的个数和参数类型不同,这就是函数重载,即一个函数名多用。
五、带缺省参数的函数:
一般情况下,实参个数应与形参个数相同,C++允许实参个数与形参个数不同,办法是在形参表列中读一一个或几个形参指定缺省值(或称默认值)。其形式如下:
函数类型 函数名(参数类型 参数1,参数类型 参数2,参数类型 参数3=常量) 注意:赋予缺省值的参数必须防在形参表列中的最右端。
注意:不要同时使用重载函数和缺省参数的函数,因为当调用函数时少写一个参数,系统无法判定是利用重载函数还是利用缺省参数的函数,会发生错误。
六、变量的引用类型:
(1).概念:“引用”(reference)是C++的一种新的变量类型,是对C的一个重要扩充,它的作用是为一个变量起一个别名。一个变量a,想给a起一个别名b,可以这样写:int a; int &b=a;这里的“&”是“引用声明符”,并不代表地址。
(2).引用的简单使用:(略过)
(3).引用作为函数参数:
C语言中函数参数传递有以下两种情况:
a.将变量名作为实参,这时传给形参的是变量的值,传递是单向的,在执行函数期间形参值发生变化并不传回给实参,因为在调用函数时,形参和实参不是同一个存储单元。
b.传递变量的指针,使形参得到一个变量的地址,这时形参指针变量指向实参变量单元。
在C语言中,只有“值形参”而无“变量形参”,全部都采用值传递的方式,C++把引用类型变量作为函数参数,就弥补了这个不足。C++提供了向函数传递数据的第三种方法,即传送变量的别名。
七、内置函数:
调用函数时需要一定的时间, 如果有的函数需要频繁使用,则所用时间会很长,从而降低程序的执行效率。C++提供一种提高效率的方法,即在编译时将所调用函数的代码嵌入到主调函数中,这中嵌入到主调函数中的函数称为内置函数(inline function),又称内嵌函数,在有写书中译为“内联函数”。
指定内置函数的方法很简单,只需在函数首行的左端加一个关键字inline即可。简单的说内置函数其实就是用函数体的代码代替主调函数中的调用函数一项,同时将实参代替形参,虽然增加了目标程序的长度,但这样可以节省运行时间,对于规模很小而使用频繁的函数,可大大提高运行速度。
八、作用域运算符:
C++提供作用域运算符"::",它能指定所需要的作用域。注意:不能用"::"访问函数中的局部变量。
九、动态分配/撤消内存的运算符new和delete:
C++提用了比较简便而功能较强的运算符new和delete来取代malloc和free函数(为了与C语言兼容,仍保留这两个函数)。
new运算符使用的一般格式为:
new 类型 [初值]
用new分配数组空间时不能指定初值。
delete运算符使用的一般格式为:
delete [] 指针变量
注意:new和delete是运算符,不是函数,因此执行效率高。malloc要和free函数配合使用,new和delete配合使用。不要混合使用(如用malloc函数分配空间,用delete撤消,这样是不允许的)。
C++中值传递、指针传递、引用传递的总结 收藏
1. 值传递:形参是实参的拷贝,改变形参的值并不会影响外部实参的值。从被调用函数的角度来说,值传递是单向的(实参->形参),参数的值只能传入,不能传出。当函数内部需要修改参数,并且不希望这个改变影响调用者时,采用值传递。
void swap(int a,int b)
{
int temp;
temp=a;
a=b;
b=temp;
cout<<a<<’ ‘<<b<<’\n’;
}
int main(){
int x=1;
int y=2;
swap(x,y);
cout<<x<<’ ‘<<y<<’\n’;
return 0;
}
用gdb调试后发现,x,y的地址分别是0xffbef938, 0xffbef934, 值分别是1,2。而形参a,b的地址分别是0xffbef918,0xffbef914, 虽然它们存储的值和x,y一样,都是1,2,但是这只是拷贝过来的。swap只交换了a,b,并不会改变x,y的值。输出为2,1;1,2
2. 指针传递:
void swap(int *a,int *b)
{
int temp;
temp=*a;
*a=*b;
*b=temp;
cout<<*a<<’ ‘<<*b<<’\n’;
}
int main(){
int x=1;
int y=2;
swap(&x,&y);
cout<<x<<’ ‘<<y<<’\n’;
}
输出结果是2,1;2,1。实参x,y, 形参a,b的地址同上,但是a,b的内容分别为0xffbef938(x的地址),0xffbef934(y的地址),*a也就是0xffbef938内存中存放的内容,即x的值1。简单地说,a是一个指向外部实参地址的指针,*a是指针的内容,如果改变了*a也必然导致外部实参的改变。
3. 引用传递:
void swap(int &a,int &b)
{
int temp;
temp=a;
a=b;
b=temp;
cout<<a<<’ ‘<<b<<’\n’;
}
int main(){
int x=1;
int y=2;
swap(x,y);
cout<<x<<’ ‘<<y<<’\n’;
return 0;
}
输出是2,1;2,1。实参x,y的地址同上。然而与指针传递不同的是,形参a,b的地址也与x,y相同,即0xffbef938, 0xffbef934。这样一来,交换a,b就相当于交换x,y。
指针传递和引用传递一般适用于:函数内部修改参数并且希望改动影响调用者。对比值传递,指针/引用传递可以将改变由形参“传给”实参(实际上就是直接在实参的内存上修改,不像值传递将实参的值拷贝到另外的内存地址中才修改)。指针/引用传递的另外一种用法是:当一个函数实际需要返回多个值,而只能显式返回一个值时,可以将另外需要返回的变量以指针/引用传递给函数,这样在函数内部修改并且返回后,调用者可以拿到被修改过后的变量,也相当于一个隐式的返回值传递吧。
至于指针/引用传递的格式,可以参考以下的内容:
int x=1;
int *y=&x; //用于指针传递,y有自己独立的内存地址,存储的内容是x的地址,*y是x的值
int &z=x; //用于引用传递,可以理解为z就是x,x就是z,只不过名字不一样
最后再啰嗦一个例子:
int change1(char* name){
name=”alter”;
return 1;
}
int change2(char* &name){
name=”alter”;
return 1;
}
int main(){
char* string=”original!”;
change1(string);
cout<<string<<’\n’;
change2(string);
cout<<string<<’\n’;
}