一.命名空间
1.命名空间的定义
命名空间的名字在其所在作用域中是唯一的,命名空间可以在全局作用域或者其它作用域内部定义,但是不能在函数或者类的内部定义,命名空间作用域不能以分号结束。
(1)每个命名空间都是一个作用域
命名空间中的每个名字必须引用该命名空间中的唯一实体,命名空间中的实体称为命名空间的成员,不同命名空间的成员可以具有相同的名字。
命名空间内部各成员之间可以直接访问,外部的代码必须指出所引用成员名字定义在哪个命名空间中。namespace 关键字使得我们可以通过创建作用范围来对全局命名空间进行分隔。本质上来讲,一个命名空间就定义了一个范围。名字空间域是随标准C++而引入的。它相当于一个更加灵活的文件域(全局 域),可以用花括号把文件的一部分括起来,并以关键字namespace开头给它 起一个名字:
namespace A1
{
int a=10;
}
namespace A2
{
int b=10;
}
(2)从命名空间外部使用命名空间成员:
使用限定名namespace_name::member_name
使用这种方法引用成员可能有些麻烦,可以使用using声明
using cpp_primer::Query;
在此声明之后,程序无需使用cpp_primer限定符,可直接使用成员名字Query。
(3)名字空间域解决全局命名冲突的问题.
标准C++库中的所有组件都是在一个被称为std的名字空间中声明和定义的。在 采用标准C++的平台上使用标准C++库中的组件,只要写一个using指示符: using namespace std; 就可以直接使用标准C++库中的所有成员。 或者 std::成员 的方式也可以使用C++库里的成员。
#include
using namespace std;
main()
{
std::cout<<"hello world"<<std::endl;
return0;
}
(4)命名空间定义可以是不连续的
与其他作用域不同,命名空间可以在不同的部分定义,命名空间由这些分离的定义部分组成,从这点来看,命名空间的定义是可以累积的。
命名空间可以分散在不同的文件中,在不同的文件中的命名空间定义也是累积的。
由于名字只在声明名字的文件中可见,在这一规定的限制下,如果命名空间的一部分需要定义在另外的文件中,那么被定义部分的名字依然要再次声明。
也就是说,如果该成员之前不存在,那就新增该成员及定义;如果该成员已经在其他文件中声明,那么在此处只是由于要定义所以再次出现了声明。
2.C++基本的输入输出流(简单介绍一下就行)
cout是标准输出流对象,<< 是输出操作符;
cin是标准输入流对象,>>是输入操作符;
endl是换行操作符;
#include
using namespace std;
int main ()
{
double d1 = 2.22;
cout<<"c++ type:" <<"int->"<< i1<<" double->"<< d1<
cin>>i1 >>d1;
cout<<"c++ type:" <<"int->"<< i1<<" double->"<< d1<
3.重载(C++为什么支持重载?)
重载函数是函数的一种特殊情况,为方便使用,C++允许在同一范围中声明几个功能类似的同名函数,但是这些同名函数的形式参数(指参数的个数、类型或者顺序)必须不同,返回值没有特殊要求,也就是说用同一个运算符完成不同的运算功能。这就是重载函数。重载函数常用来实现功能类似而所处理的数据类型不同的问题。
4.C++缺省参数
所谓缺省参数,顾名思义,就是在声明函数的某个参数的时候为之指定一个默认值,在调用该函数的时候如果采用该默认值,你就无须指定该参数。
缺省参数使用主要规则:调用时你只能从最后一个参数开始进行省略,换句话说,如果你要省略一个参数,你必须省略它后面所有的参数。
//全缺省参数
int Add1 (int a = 0, int b = 0)
{
return a + b;
}
//半缺省参数
int Add2 (int a, int b = 0)
{
return a+b;
}
void Test ()
{
Add1();
Add1(1);
Add1(1,1);
Add2(2);
Add2(2,2);
}
5.指针和引用(概念、使用方法、做参数、做返回值的作用,指针和引用的区别)
(1)引用不是定义一个新的变量,而是给一个已经定义的变量重新起一个别名。
指针是一个指向一个内存单元的地址
int a=1;
int*p=a;
intb=1
int&b=a;
(2)对于引用 :一个变量可取多个别名 ,引用必须初始化 ,引用只能在初始化的时候引用一次,不能改变为再引用其他的变量。而对于指针,存在多级指针并且指针可以为空
定义的格式为: 类型 &引用变量名 = 已定义过的变量名;
引用的特点:
一个变量可取多个别名 引用必须初始化 引用只能在初始化的时候引用一次,不能改变为再引用其他的变量。
void TestReference1 ()
{
int a = 1;
int& b = a;
cout<<"a:address->" <<&a<< endl;
cout<<"b:address->" <<&b<< endl;
a = 2;
b = 3;
int& c = b; // 引用一个引用变量,别名的别名
c = 4;
}
上述代码中a,b,c三个变量是一样的,地址也是相同的。
//const引用
void TestReference2 ()
{
int d1 = 4;
const int & d2 = d1;
d1 = 5; // d1改变 d2的值也会改变。
//d2 = 6; // 不能给常量(不能被修改的量)赋值
const int d3 = 1;
const int & d4 = d3;
//int&d5 = d3;
const int & d6 = 5; // 常量具有常性,只有常引用可以引用常量
double d7 = 1.1;
//int& d8 = d7; //d7是double类型,d8是int,d7赋值给 d8时要生成一个临时变量
// 也就是说d8引用的是这个带有常性的临时变量,所以不能赋值。
const int& d9 = d7;
}
//引用作为参数
【引用传递】如果形参为引用类型,则形参是实参的别名。
void Swap (int& left, int& right)
{
int temp = left;
right=left;
left=temp;
}
【指针传递】
void Swap (int* pLeft, int* pRight)
int temp = *pLeft;
*pleft=*pright;
*pRight = temp;
//传引用作为返回值
int& Add (int d1, int d2)
{
int ret = d1 + d2;
return ret ;
}
传值作为返回值
int Add (int a, int b)
{
return a + b;
}
//传值返回时,是将ret的值放到寄存器中;传引用返回时,是将ret的地址放到寄存器中
(3)引用和指针的区别和联系(注意笔试的时候非常喜欢考这个知识点)
引用只能在定义时初始化一次,之后不能改变指向其它变量(从一而终);指针变量的值可变。
引用必须指向有效的变量,指针可以为空。
sizeof指针对象和引用对象的意义不一样。sizeof引用得到的是所指向的变量的大小,而sizeof指针是对象地址的大小。
指针和引用自增(++)自减(–)意义不一样。
相对而言,引用比指针更安全。