一、命名空间的定义
1.定义命名空间,需要用到namespa关键字,后面跟上命名空间的名字,然后接上{}即可,{}中即为命名空间的成员,命名空间中可以定义变量/函数/类型等。
2.不同的命名空间可以拥有相同名字的函数,其本质是一个独立的域,并不会产生冲突。
3.域分为函数局部域,全局域,命名空间域,类域。前两者会对生命周期有影响,后两者则不会。
4.namespace仅能在全局定义,它还可以嵌套定义(即在全局定义的namespace中可以再定义一个域)。
5.多文件中同名的namespace会被认为是一个域,会在逻辑上进行合并。如下:
namespace ruosu
{
int rand = 0;
}//头文件中
int rand = 10;
namespace ruosu
{
int rand = 0;
}//主文件中
cout<<ruosu::rand<<endl;//结果为0
cout<<rand<<endl;//结果为10,这里默认访问的是全局变量中的rand的值
二、命名空间的使用
1.大多数情况下推荐直接指定命名空间访问,如上。
2.可以将命名空间中的某个成员展开。
3.还可以直接将命名空间中的所有成员展开,但是风险较大,不推荐使用。
namespace ruosu
{
int rand = 0;
int sky = 10;
}//主文件中
using ruosu::sky;//将部分不冲突的成员展开
int main()
{
cout<<ruosu::rand<<endl;
cout<<sky<<endl;
}//输出结果应为0,10
///
using namespace ruosu;//将全部成员展开
三、缺省参数
1.全缺省:
void func1(int a = 10,int b = 0,int c =1)//全缺省即为全部参数都可以不传递值
{
cout<<a<<" "<<b<<" "<<c<<endl;
}//输出结果应为10 0 1
void func2(int a,int b = 10,int c = 20)//半缺省为部分参数可以不传值
{
cout<<a<<" "<<b<<" "<<c;
}
int main()
{
func1();
func1(1);
func1(1,2);
func1(1,2,3);
func2(100);
func2(100,200);
func2(100,200,300);
//func2()这种写法会报错
return 0;
}
四、函数重载
1.与C语言中的不同是C++中的函数允许重名,只不过参数的类型不能一样,也可以是参数个数不同,满足以上两点中的任意一点且函数命一样则构成了函数同载。这样体现了C++调用函数的多态行为,使用起来更加灵活。最最重要的一点是,在如下的例子中可以使用同一个函数名去处理不同类型的情况,这样的感觉比起C中要写两个不同名字的情况真的很爽!!!
int Add(int a,int b)
{
return a+b;
}
double Add(double a, double b)
{
return a+b;
}
int main()
{
c = Add(2,3);
d = Add(3.12,4.32);
cout<<c<<" "<<d<<endl;
}//输出结果应为5 7.44
五、引用
1.类型& 引用别名 = 引用对象;
int main()
{
int a = 0;
int& b = a;
int& c = b;
a = 1;
cout<<a<<" "<<b<<" "<<c;//输出结果应为0 0 0
}//引用的本质就是给引用对象取一个别名,就相当于水浒传中的林冲可以叫他为豹子头,也可以叫他林冲,本质上是同一个人
六、类的定义
1.class为定义类的关键字,Stack为类的名字,{}中为类的主体,注意类定义结束时后⾯分号不能省略。类体中内容称为类的成员:类中的变量称为类的属性或成员变量; 类中的函数称为类的⽅法或者成员函数。
using namespace std
class Stack//类的定义
{
public:
void Init()
{}
void Push()
{}
private:
int* a;
int b = 1;
}
int main()
{
Stack a;
c = a.b;//c = 1//private和protect需要间接使用
Init();//public可以直接使用
}