一、命名空间
(1)命名空间域是随标准c++而引入的,相当于一个更加灵活的文件域(全局域)。可以用花括号把文件的一部分括起来,并以关键字namespace开头给命名空间起一个名字,同时采用using指示符进行。其结构如下:
eg1:
namespace my
{
int a=0;
}
eg2:
namespace you
{
int a=1;
}
若以上两个命名空间在同一函数内进行全局定义,则程序不会报错,可见同名变量在同一作用域中是可以共同存在的。因此,命名空间域解决了全局命名冲突的问题。
另外,命名空间是可以嵌套的,如下例:
eg3:
namespace you
{
int a=1;
namespace he
{
int b=3;
}
}
(2)在访问命名空间中的变量时,可以使用作用域解析符(域作用访问符)::。例如在访问eg1中的变量a时,可以采用my::a语句,在访问eg3中的变量b时,可以采用you::he::b语句。
(3)标准c++库中的所有组件都是在一个被称为std的命名空间中声明和定义的,即namespace std是c++标准库的命名空间。在采用标准c++的平台上使用标准c++库中的组件时,只需要一个using指示符,从而用using namespace std;语句来使用c++标准库。
除此之外还可以直接使用::符号使用c++标准库中的成员,如下例:
eg4:
std::cout<<"123"<<std::endl;
二、C++基本的输入输出流
cout是c++中的标准输出流对象,<<是输出操作符;cin是c++中的标准输入流对象,>>是输入操作符。
它们都属于c++标准库,所以都在std命名空间中。
三、重载
所谓函数重载,即在同一作用域内,一组函数的函数名相同,参数列表不同(个数或类型不同),返回值可相同也可不相同。
例如Swap(int a,int b){}与Swap(char a,char b){}两个函数即Swap函数的重载。之所以两个函数可以同时存在,还在于c++对函数名的修饰规则。其实在底层操作中,如在汇编语言中,会将第一个Swap函数的名字定义为-Z4Swapii,而将第二个Swap函数的名字定义为-Z4Swapcc。以下为其解释:
四、C++缺省参数
对于缺省参数的函数,可以从下面的例子中进行学习。
int Add (int a=10,int b=20)
{
return a+b;
}
cout<<Add(1,2)<<endl;
cout<<Add()<<endl;
cout<<Add(5,)<<endl;
cout<<Add(,5)<<endl;
输出分别为:3、30、25、err。此时Add函数为全缺省函数,若传实参则用实参的值,若不传参则用缺省默认的。
同时还有一种半缺省函数:
int Add(int a,int b=10)
{
return a+b;
}
需要注意的是,对于半缺省函数,只能从右往左进行缺省。
五、指针和引用
(1)引用的概念
引用不是定义一个新的变量,而是给一个已经定义的变量重新起一个别名。定义的格式为: 类型 &引用变量名=已定义过的变量名。
(2)引用的特点
一个变量可以取多个别名(有多个引用)。
引用必须初始化。
引用只能在初始化的时候引用一次,不能改变为再引用其他的变量。
(3)使用需要注意的地方
a. 常量具有常属性,在引用时只能用常引用。
b. 对于double d7=1.1;int &d8=d7; 运行时会出错,因为d7是double型的,d8是int型的,在d7赋值给d8时,需要生成一个临时变量,而d8引用的便是这个具有常属性的临时变量。
(4)引用做函数参数
a. 如果形参为非引用的传值方式,则生成局部临时变量接受实参的值。如果形参为引用类型,则形参是实参的别名。
b. 当不希望函数内改变x的值时,尽量使用常引用传参。
c. 不要返回一个临时变量的引用。
d.如果返回对象出了当前函数的作用域依然存在,则最好使用引用传参,因为这样更高效。
(5)引用与指针的区别和联系
a. 引用只能在定义时初始化一次,之后不能再指向别的变量;指针的值可变。
b. 引用必须指向有效的变量,指针可以为空。
c. sizeof引用得到的是所指向变量的大小,sizeof指针得到的是对象地址的大小。
d. 引用++是加值的大小,指针++是加类型大小。
e. 相对而言,引用比指针更安全。