可爱的C++(一)

知识点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++冲鸭!!!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值