1. c++与c语言的区别
c++兼容c语言90%以上的语法与规则,c语言相当于用锤子和凿子制作工艺品,c++相当于用电钻,电动雕刻刀制作工艺品。
2. c++的框架
#include<iostream> //stdio.h的升级版
using namespace std; //展开命名空间stdint main()
{//主程序return 0;
}
2.1 关于iostream
io 即 in、out,stream 即 流,连在一起就是输入输出流。是stdio.h(标准输入输出)的升级版本。
2.1 关于using namespace std
using namespace std 直接翻译就是 使用--命名空间--std,通常叫做----->展开命名空间--std。
3. 命名空间概述
#include<iostream> //stdio.h的升级版
using namespace std; //展开命名空间stdnamespace abc
{int a = 10;int b = 3;
}int main()
{int a = 99;cout << a << endl;cout << abc::a << endl;return 0;
}
以上程序中,创建了一个abc的命名空间,里面有a=10,b=3 两个变量。在主函数中,可以定义相同名字的变量,并选择性的使用他们,需要使用命名空间内的a,就可以用空间名::变量名。(两个冒号)。
同样的,命名空间里可以使用函数和结构体等。
举个例子,在一个枪战游戏项目中,我负责的是自动步枪射击的模块,我老婆负责的是狙击枪的射击模块,自动步枪的射击是连续的,按下开枪键位连续发射子弹,而狙击枪是按一次发射一次子弹,如果没有命名空间,我们的射击函数名都叫shoot,那么我们俩的模块合并之后,在主程序中调用shoot到底是调用的哪个shoot ?
所以可以把两个人写的shoot分别放到自己的命名空间里,调用步枪的射击函数时可以用
我::shoot(…………); ,调用狙击枪的射击函数时可以用 我老婆::shoot(…………)。
3.1 命名空间的展开
1. 指定命名空间
参照下面的程序段
#include<iostream> //stdio.h的升级版
using namespace std; //展开命名空间stdnamespace 我
{void shoot(){cout << "我的shoot" << endl;}
}namespace 我老婆
{void shoot(){cout << "我老婆的shoot" << endl;}
}int main()
{我老婆::shoot();我::shoot();return 0;
}
输出为
这种调用方式是指定命名空间的方法。
2. 指定命名空间的内容展开
这里的 using 我老婆::shoot就是指定展开了一个命名空间里的函数.
3. 展开整个命名空间
、
3.2 命名空间总结
1.指定命名空间
2.指定命名空间的内容展开
3.展开整个命名空间
4. 缺省函数
先看代码
#include<iostream> //stdio.h的升级版
using namespace std; //展开命名空间stdnamespace lty
{void shoot(int x, int a = 10, int b = 3){cout << x + a - b << endl;}
}int main()
{using namespace lty;shoot(1);return 0;
}
这段代码中,shoot的参数有3个,分别是x,a=10,b=3。默认情况下,我们调用shoot(1),输出结果为1+10-3==8。
所以缺省函数可以理解为,带有默认参数值的函数,并且参数中的默认参数值必须在后面。
这种写法是不对的:
因为默认参数在后面,所以调用shoot(5,8)的话,5是给a的,8是给b的,x的值是随机值。
传值是按顺序传的,所以int x必须放在前面,这样传1个值,默认就是给x赋值了。
4.1 全缺省和半缺省
全缺省函数就是----参数全部带有默认值的函数。
半缺省不用多说。
4.2 缺省函数的应用价值
在顺序表中,扩容的消耗非常大,需要不停的寻找新的空间并拷贝数据。
如果已经知道需要多大的空间,那么使用缺省参数就可以很方便的通过传参一次性扩容。
参见下面的代码
#include<iostream>
using namespace std;typedef int datatype;typedef struct stack
{datatype* lty;int num;int size;
}stack;//栈初始化
stack* stackinit(int a = 4) //默认参数为4
{stack* tempstack=(stack*)malloc(sizeof(stack));datatype* tempdata = (datatype*)malloc(sizeof(datatype) * a); //默认申请4个数据的空间tempstack->lty = tempdata;tempstack->num=0;tempstack->size = a;return tempstack;
}int main()
{stack* lty = stackinit(20); //直接申请20个数据的空间for (int k = 0; k < 20; k++){lty->lty[k] = k + k;}lty->num = 20;for (int k = 0; k < 20; k++) //输出栈内的数据{cout << lty->lty[k] << "-->";}return 0;
}
函数默认参数为a=4;那么调用函数不传值初始化,默认开辟4个数据的空间。
传20给stackinit,就会开辟20个数据的空间。
完毕