c++标准输入输出
对于c++来说,因为时兼容c的,所以c的输入输出依然适用,但是只有使用cout<<,cin>>才能显示c++的输入风格,但是我们也知道,使用cin>>比scanf慢
函数原型
可以采用简化的声明方式
#include<iostream>
using namespace std;
void write(char *s);//函数声明
int main()
{
write("Hellow world");
return 0;
}
void write(char *s)
{
cout<<s;
}
也可以 这样声明来简化
void write();
省略掉函数里面的参数
const修饰符
类似于c的#define,但是更安全。
内联函数inline
1. 内联函数类似于define 了一下,调用到那里就相当于执行了函数的语句。
2.内联函数在第一次调用之前必须要有完整的定义
3.是一种空间换时间的措施,消除函数调用时的开销。
函数重载
c++允许函数名一样但是具体功能不同的函数,也就是函数的重载,但是你之所以想用一个函数名来表达是因为这几个函数肯定是有相同点的,比如计算图形的面积
长方体面积 Rectangle(int length,int width)
正方体面积 Cube(int length)
圆的面积 Circular(int radius)
大家看这几个函数,其实执行的都是一个功能,算面积,但是算的图形不同,函数体肯定也是不一样的,我们可以用一样的函数名,Area(),函数名虽然一样,但是形参的个数或者数据类型也是不一样的,在函数调用是就是这样区分的
注意:函数的返回值不在函数的检查之列
::作用域标识符
希望在局部变量的作用域内使用全局变量,可以变量名前加上::。
关于new和delete
程序运行时,计算机的内存被分成四个区,程序代码区,全程数据区,栈和堆。
对于程序中的变量,存储的位置主要有这几个:
1、栈区(stack):由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。,也就是说我们在函数中定义的局部变量就放的栈区,自动分配的!
2.堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 .c中的malloc,c++中的new就是分配的堆中的空间,首先应该知道操作系统有一个记录空闲内存地址的链表,当系统收到程序的申请时,
会遍历该链表,寻找第一个空间大于所申请空间的堆结点,然后将该结点从空闲结点链表中删除,并将该结点的空间分配给程序,另外,对于大多数系统,会在这块内存空间中的首地址处记录本次分配的大小,这样,代码中的delete语句才能正确的释放本内存空间。另外,由于找到的堆结点的大小不一定正好等于申请的大小,系统会自动的将多余的那部分重新放入空闲链表中。 感觉有些小复杂!!
3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后有系统释放 问题:全局区的内存有多大呢!!!!!
3.3申请大小的限制
栈:在Windows下,栈是向低地址扩展的数据结构,是一块连续的内存的区域。这句话的意思是栈顶的地址和栈的最大容量是系统预先规定好的,在 WINDOWS下,栈的大小是2M(也有的说是1M,总之是一个编译时就确定的常数),如果申请的空间超过栈的剩余空间时,将提示overflow。因此,能从栈获得的空间较小。 所以说我们平时的局部变量不能开太大
堆:堆是向高地址扩展的数据结构,是不连续的内存区域。这是由于系统是用链表来存储的空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。堆的大小受限于计算机系统中有效的虚拟内存。由此可见,堆获得的空间比较灵活,也比较大。
new给数组申请空间:
int* a=new int[3][2][3];
数组的首地址就是指针a;
删除空间时,只需执行delete []a;//不用指明数组的大小和维数。
new在给简单变量申请空间时可以直接赋初值
#include<iostream>
using namespace std;
int a[]={1,3,5,7,9};
int& index(int );
int main()
{
cout<<index(2)<<endl;
index(2)=25;
cout<<index(2)<<endl;
return 0;
}
int& index(int i)
{
return a[i];
}