b站链接
一、命名空间
1引入
一项工程,你和小张要一起完成,你们在各自编写模块代码的时候都同时编写了一个相通名字的接口,等代码合并时,导致了命名冲突。
c语言不能有效解决这个问题。下方代码会出错。
int scanf=10;
int main ()
{
printf("%d",scarf);
}
所以c++引入命名空间。
命名空间作用:将标识符本地化。
2定义
namespace N1
{
int a;
void swap(int *a,int *b)
{
int tmp=*a;
*a=*b;
*b=tmp;
}
举例:Myname命名空间将int型的scanf关进小黑屋。不能在main里调用
namespace Myname
{
int scanf=100;
}
int main ()
{
printf("%p",scanf);
}
那如何调用命名空间里的变量呢?
1加作用域限制符::,此时输出为100
namespace Myname
{
int scanf=100;
}
int main ()
{
printf("%d",Myname::scanf);
}
2使用。using Myname::a。或者 using namespace Myname 全部导入
把a释放出来
namespace Myname
{
int a=100;
}
using Myname::a;
int main ()
{
printf("%d",a);
}
using namespace std;可以解释为输入输出(cout等)全都包含在std命名空间里,需要导入
二、输入输出
1.cout(控制台)
cout<<"hello\n"; //意思是把hello流向控制台
cout<<"hello"<<endl; //endl表示换行符 endline
std::cout<<"hello\n";
2cin(键盘)
int a=0;
std::cin>>a;
std::cout<<a<<std::endl;
连续输入
std::cin>>a>>c; //先输入a,再输入c
三缺省参数
1情景导入
要一个初始化数组大小的函数,由于不知道申请多少空间,初始化先随机申请,后序用的时候再扩充。
c语言无法实现。
2概念
指的是定义函数的时候,指定一个参数使其具有默认值,如果进行调用的时候传入实参,则用,否则用默认值。
3示例:
void test(int a=1)//默认值
{
std::cout<<a<<std::endl;
}int main ()
{
tesst();//不传参情况
test(10);
};
4
全缺省参数
半缺省参数
5注意事项
缺省参数不能放在声明中
//a.h
void test(int a);
//a.c
void test(int a=10){}
四、函数重载
1.情景引入
学c语言的时候必然会做一个联系是计算器,加减乘除用四个不同函数名的函数。但在c++中不一样。
2概念
c++中允许声明几个功能类似的同名函数,但这些同名函数的形参必须不同。(个数/类型/顺序)
int add(int a) return a;
double add(double a)return a;
本质原因:g++编译的时候函数修饰带参数
3
为了照顾c的项目:反修饰
extern "C" int add(int a);
五、引用
引用就是起别名,这一片内存空间叫a,然后给它起个额外的别名叫b。a和b操作同片内存空间。
int a=10;
int&b =a;
1常引用
c语言我们知道,如果定义一个常整型,表示这个整型变量不能被修改,如果用普通引用就会出问题。
int main(){
const int a=10;
int& b=a;}//错误,权限被放大,引用前只可读,引用后可读可写
为了 保证引用后权限不变,就必须用常引用。
int main(){
const int a=10;
const int& b=a;//常引用
}
指针和引用时权限不能放大,但可以缩小。
int main(){
int a=10;
const int& b=a;//常引用
}
引用常数时,必须用常引用。
int& a=10;//错误
int& a=10;//错误
c语言中,浮点转为整型时,有个中间过程,会涉及到一个具有常性的中间变量,得用常引用
double a=3.14;
int b=a;
int& ps=a;//错误
const int& ps=a;//正确
常引用好处在形参(1可以传入权限大的int,2也可以传入double)
void test(const DataType& x)
{}