c++入门
- 空间命名
- 域
- 多文件namespace名字相同
- c++输入输出
- 函数重载
- 引用
空间命名
#include<iostream>
using namespace std;
int main()
{cout<<"hello world"<<endl; return 0;
}
这是一段c++代码,代码中using namespace std
,表示将一个名为std的空间里的成员全部展开,而namespace是一个关键字,用来定义命名空间。
namespace 空间名字
{空间成员
}
比如:
#include<iostream>
using namespace std;
namespace r
{int a=1;
}
int main()
{cout<<r::a<<endl;return 0;
}
运行这段代码将会在屏幕上输出"hello world",在输出语句中,我们用到了::
、<<
和>>
符号,::
这个符号叫作用域限定符
,另外两个符号下文会讲到。
域
在c语言学习中,我们学到了“全局域”和“局部域”,在c++中我们又将学到"命名空间域"和“类域”,在本文中我们只讲解“命名空间域”,类域在后面会讲到。
namespace本质上是定义了一个域,这个域是跟全局域独立开来的,或者说有命名空间域就是为了与全局域隔离开来。
#include<stdio.h>
#include<stdlib.h>
int rand=1;
int main()
{printf("%d\n",rand);return 0;
}
这段c语言代码编译时编译会不通过,因为全局变量rand与库函数rand()命名冲突,此时如果我们使用namespace就能很好的解决这个问题。(namespace属于c++关键字如果在.c文件下使用将会报错)
#include<stdio.h>
#include<stdlib.h>
namesapce r
{int rand=0;
}
int main()
{printf("%d\n",r::rand);//这里如果不使用命名域隔离开,会报错,因为域stdlib.h头文件中的函数产生命名冲突return 0;
}
域做到了名字隔离。与全局变量进行隔离
多文件namespace名字相同
在多文件中,namespace命名的同名空间会被认为是同一个,不会冲突。
.h文件下
.c文件下
最终运行结果
成功运行并且结果正确。
现在回到开头看到的那段代码:
#include<iostream>
using namespace std;
int main()
{cout<<"hello world"<<endl; return 0;
}
这里我们展开了一个std域,这个域里面包含了c++标准库。若没有展开这个域,那这段代码将写成这样:
#include<iostream>int main()
{std::cout<<"hello world"<<std::endl; return 0;
}
我们了解了::
接下来我们在讲讲<<
、>>
以及cout
、endl
还有cin
c++输入输出
c++标准库都放在一个叫std的命名空间里面
是 Input Output Stream 的缩写,是标准的输⼊、输出流库,定义了标准的输⼊、输
出对象。
#include<iostream>
int main()
{std::cout<<"hello world"<<std::endl;return 0;
}
cout是输入流,cin是输出流,输出语句的末尾加上endl在语句输出时会自动加上一个换行符。
<<
时流插入符,>>
是流提取符,c++输入输出语句相比较c语言,省去了指定类型的过程,更加方便
关于代码中std
,这是因为没有展开std
域,所以需要通过作用域限定符来使用域中的成员。
通过cin读取数据,再通过cout输出数据。在读取时,cout会自动的将字符串转换成相应类型,输出时又会自动将数据转换成字符串,这个过程现在不需要深入了解,只需要会使用cout与cin就行。
函数重载
(c语言不支持)
函数重载:函数名相同,但参数类型,个数不同。
类型不同:
int fun(int a,int b)
{return a + b;
}int fun(int a,double b)
{return b + a;
}
个数不同:
int fun(int a,int b)
{return a + b;
}int fun(int a)
{return a;
}
返回值不同能不能构成重载?答案是:不能。
看下面这段代码:
int fun(int a=1,int b=1)
{return a + b;
}double fun(int a=2,int b=2)
{return b + a;
}int main()
{fun();//调用函数不传参,不接收返回值,这样就不知道你调用的是那个函数了return 0;
}
再来看一段代码:思考一下它构成重载吗?
void fun()
{cout<<"f()"<<endl;
}void fun(int a=1)
{cout<<"f(int a)"<<endl;
}
//不构成重载,因为存在歧义,当不传入参数时,编译器不知道你调用的是那个函数
引用
引用就是给变量取别名。
int a=0;
int& b=a;
//还可以给别名取别名
int& c=b;
int& d=c;//&叫做引用,不是取地址,如果写成int* p=&a,这就是取地址
虽然取了别名,但是它们代表的还是同一块空间,只是名字多了些“外号”,就比如:孙悟空又叫齐天大圣,弼马温,孙行者,行者孙。名字虽多,但是都表示孙悟空这一个猴。引用也是如此。
typedef与引用的区别:与typedef的区别:typedef是给类型取别名,而&是给变量取别名