1 命名空间
命名空间相当于一个更加灵活的全局域,可以用花括号把文件的一部分括起来,并以关键字namespace开头给它起一个名字
如下定义两个命名空间
namespace AA1{
int a = 10;
}
namespace AA2{
int a = 20;
}
int main()
{
cout << AA1::a << endl; //::是域作用限定符
system("pause");
return 0;
}
可以看到两个变量名都可以用a所以命名空间域解决了全局命名冲突的问题
标准C++库中所有组件都是在一个被称为std的名字空间中声明和定义的。在采用标准C++平台上使用标准C++库中的组件,只要写一个using指示符:using namespace std,就可以直接使用标准C++库中的所有成员。
命名空间可以嵌套
namespace AA1{
int a = 10;
namespace AA2{
int a = 20;
}
}
int main()
{
cout << AA1::AA2::a << endl; //访问命名空间AA2里的变量a
system("pause");
return 0;
}
2 C++基本的输入输出流
标准输入流是从标准输入设备(键盘)流向程序的数据,在头文件iostream.h中定义了cin,cout,cerr,clog4个流对象。cin是输入流,cout,cout,cerr,clog是输出流。
cin是istream类的对象,它从标准输入设备(键盘)获取数据,程序中的变量通过流提取符“>>”从流中提取数据。流提取符“>>”从流中提取数据时通常输入流中的空格,tab键,换行符等空白字符。
注:只有在输入完数据再按回车键后,该行数据才能进入键盘缓冲区,形成输入流,提取运算符“>>”,才能从中提取数据。
预定义的对象cout是ostream类的一个实例。cout对象连接到标准输出设备,通常是显示屏。cout与流插入运算符“<<”结合使用,C++编译器根据要输出变量的数据类型,选择合适的流插入运算符来显示值。<<运算符被重载来输出内置类型(整型,浮点型,double型,字符串和指针)的数据项。
流插入运算符<<在一个语句中可以多次使用。
3 重载
重载:函数名相同,函数的参数列表不同(包括参数个数和参数类型),返回类型可同可不同。重载是可使函数,运算符等处理不同类型数据或是接受不同个数的参数的一种方法。
注:返回值不同不能构成重载
void foo(int x, int y)
{
//
}
void foo(char c)
{
//
}
如上两个函数构成重载,以函数声明void foo(int x,int y)为例,该函数被C编译器编译后在库中的名字为_foo,而C++编译器则会产生像_foo_int_int之类的名字用来支持函数重载和类型安全连接。在找名字链接时,C语言中函数名是唯一的,所以编译器此时会报错。
4 C++缺省函数
缺省参数定义:缺省参数就是在声明方法的某个参数的时候为之指定一个默认值,在调用该方法时如果采用该默认值,就无须指定带参数。
缺省参数使用规则:
1)只有参数列表的后部参数才可以是缺省的
2)一旦使用缺省参数,那么这个参数后面的所有参数都必须是缺省的。(从左至右,第一个为缺省,则所有均为缺省参数)
3)缺省参数只能放在函数声明中,通常在一个头文件中。
int Add(int a = 10, int b = 20)
{
return a + b;
}
int main()
{
Add(1, 2);
Add();
Add(20);//半缺省,从最后一个参数缺省,20会传给第一个参数a
system("pause");
return 0;
}
5 指针和引用
引用:引用不是定义一个新的变量,而是给一个已经定义的变量重新起一个别名。
定义的格式为:类型 & 引用变量名=已经定义过的变量名
引用的特点:
1)一个变量可取多个别名
2)引用必须初始化
3)引用只能在初始化的时候引用一次,不能改变为再引用其他的变量
int main()
{
int a = 10;
int& b = a; //b是a的别名
int& c = b;//引用一个引用变量,别名的别名
c = 4;
cout << b << endl;
cout << c << endl;
system("pause");
return 0;
}
const引用
int a = 10;
const int& b = a; //b是a的别名
a = 5; //a改变b的值也会改变
//b=2; //b是常量,不能给常量赋值
cout << b << endl;
const int d1 = 1;
const int& d2 = d1; //常量具有常性,只有常引用可以引用常量
double d3 = 1.1;
//int& d4 = d3; //d3是double类型,d4是int,d3赋值给d4时要
//生成一个临时变量,d4引用的是这个带有常性的临时变量,不能赋值
引用做参数(如果形参为引用类型,则形参是实参的别名)
void swap(int& m, int& n)
{
int tmp = m;
m = n;
n = tmp;
}
引用做返回值
int& Add(int d1, int d2)
{
int ret = d1 + d2;
return ret;
}
传引用返回时,取ret的地址放到寄存器eax中如果返回对象出了当前函数的作用域依旧存在,则最好使用引用返回。
引用和指针的区别和联系
1)引用只能在定义时初始化一次,之后不能改变指向其他变量,指针变量的值可变
2)引用必须指向有效的变量,指针可以为空
3)sizeof引用得到的是所指向变量的大小,sizeof指针是对象地址的大小
4)指针和引用自增自减意义不一样
5)引用比指针更安全