知识点1——函数原型
#include<iostream>
using namespace std;
int fun(int x, int y = 1000){
cout << x << " " << y << endl;
}
int main(){
fun(1);
}
如果函数定义时是以上情况,调用时可以只给x的值也可以x与y的值都给出,不可以只给y的值。
int fun(int x, int y){
cout << x << " " << y << endl;
}
如果函数定义时是以上情况,调用时必须x与y的值都给出。
int fun(int x = 0, int y = 0){
cout << x << " " << y << endl;
}
如果函数定义时是以上情况,调用时可以x与y的值都不给出,也可以只给出x的值,也可以x与y的值都给出,不可以只给出y的值。
int fun(int x = 0, int y){
cout << x << " " << y << endl;
}
如果函数定义是以上情况,则会报错。因为默认值需从右到左依次指定。
int fun(int , int );//函数原型
int fun(int x, int y){//函数说明部分
cout << x << " " << y << endl;
}
如果函数原型与定义是以上情况,调用时必须x与y的值都给出,但这种原型不够清楚,少用。
注:函数定义由函数说明和函数体两个部分构成。函数说明部分与函数原型基本一样,函数原型的参数表中可以不包含参数的名字而只包含它们的类型,但函数说明部分中的参数必须给出参数名字,而且不能包含结尾的分号。
以下的原型说明在C++中是完全一样的:
f();//表示该函数不带任何参数
f(void);//表示该函数不带任何参数
以下的原型说明在C语言中是不同的:
f();//表示该函数的参数信息没有给出,它很有可能带有参数
f(void);//表示该函数不带任何参数
1.当函数定义在前调用在后时,编译器在调用函数之前,能从其定义中抽取函数原型; 当函数调用在前定义在后时,要求程序员在调用之前用函数原型对函数进行声明,以便编译器从中得到函数原型所提供的有关信息。
2.主函数不必进行原型的说明; 原型中没有指出返回类型,C++默认该函数的返回类型是int 如果函数没有返回值,则必须在函数原型中注明返回类型为void;
知识点2——输入输出流
使用cin和cout进行I/O操作时,必须在程序中嵌入头文件iostream和名称空间std
只有使用cin>>或cout<<才能显示C++的输入输出风格 cin>>可以连续输入多个数据,应该用空白符来分开
用cout和cin输出输入数据时,全部使用了系统缺省格式(dec)。oct(八进制)和hex(十六进制)。 cout<<dec<<x
增加了换行操纵符endl cout<<endl;
下面是个例子:
#include<iostream>
using namespace std;
int main(){
int x, y, z;
cin >> x >> y >> z;
cout<< "x = " << oct << x << ", y = " << hex << y <<", z = "<< dec << z;
}
知识点3——new和delete
#include<iostream>
#include<cstring> //string.h
using namespace std;
struct my_string{
char *p;
int len;
};
int main(){
my_string s;
//临时的输入缓冲区
char temp[1000];
//输入的数据保存到临时缓冲区中
cin >> temp;
//根据缓冲区中实际所使用的数据大小分配空间
s.p = new char[strlen(temp) + 1];
//拷贝到刚分配好的真正存储数据的空间中
strcpy(s.p, temp);
s.len = strlen(temp);
cout<< s.p << s.len << endl;
// 注意:new和delete对应的
delete s.p;
}
对于上例,在C中用malloc和free,如下:
p=(int *)malloc(sizeof(int));
free(p);
可见,new可以自动计算所要分配内存的类型的大小,而不必用sizeof()来计算所需的字节数,这就减少了发生错误的可能性,另外,new能够自动返回正确的指针类型,不必对返回指针进行强制类型转换。
注:
(1)new 是个单目运算符,它的操作数是一个类型名,如上例中的int,它的返回类型是指向操作数类型的指针。可见,动态分配存储区的基本办法是,声明一个指针,用它指向用new分配的可容纳给定类型数据的空间。如上例中可改写前两个语句为
*int p=new int;
(2)new 能自动计算它要分配的存储空间的大小,因而可以为更复杂的数据对象,如数组分配空间,如语句int *pi=new int[8]; 将给地址pi分配8个int类型空间。
使用new为多维数组分配空间时,每一维的界值大小都不能省略,以便进行存储空间大小的计算。如int *pi=new int[2][3][4];其中第一维的界值可以是任何合法表达式,如 :
int i=2;
int *pi=new int[i][3][4];
(3)new 可以在为简单变量动态分配内存空间的同时,进行初始化。例如语句
int *p = new int(518);
在为指针p分配一块int区的同时,将这个存储区初始化为518。
但是,不能用new为动态分配的数组存储区进行初始化。
(4)delete也是一个单目运算符,其作用是释放用new分配的存储空间。释放pi指向的数组存储区时,应使用下面的格式
delete [ ] pi;
毋须注以空间大小。有些版本也允许写为
delete pi;
还有的版本要求使用格式
delete [256]pi; 256是用new创建的数组pi的大小
(5) 用new分配的空间,使用结束时,应该用也只能用delete显示的释放,否则这部分空间将不能被回收而变成死空间。
使用new动态分配内存时,如果没有足够的内存满足分配要求,new将返回空指针(NULL)。因此通常对内存的动态分配是否成功进行检查。如:
int *p=new int[200];
if(!p)
{
cout<<“allocation failue!”<<endl;
exit(1);
}
(6) new和delete都可以被重载,允许建立自定义的内存管理算法
以上内容是筱筱的课堂总结,C++冲鸭!!!