C++是在C语言的基础之上,容纳进去了面向对象编程思想,并增加了许多有用的库以及编程范式等。
在C语言中,变量、函数和类的名称存在于全局作用域中,因此可能会发生许多冲突。比如:
#include<stdio.h>
#include<stdlib.h>
int rand = 10;
int main()
{
printf("rand = %d\n",rand);
return 0;
}
在上述代码中,当不包含头文件stdlib.h时并不会报错,如图:
但一旦包含头文件stdlib.h,当定义变量rand时,会产生报错,如图:
因此 ,为了使标识符的名称进行本地化,以避免命名冲突或名字污染,C++就提出了namespace(命名空间)这一关键字
一、命名空间
1.命名空间的定义
定义命名空间,需要用到namespace这一关键字,然后再namespace后面接该命名空间的名称,然后再后面加上{},其中{}内的内容就是命名空间的成员。其中命名空间内可以定义变量、函数和结构体。
命名空间的定义:
namespace ads
{
int rand = 10;//变量
int Add(int a, int b)//函数
{
return a + b;
}
struct Node//结构体
{
int val;
struct Node* next;
};
}
并且命名空间是可以嵌套的,如:
namespace ads
{
int rand = 10;
int Add(int a, int b)
{
return a + b;
}
namespace n1
{
int rand = 10;
int Add(int a, int b)
{
return a + b;
}
}
}
注:1.在同一个工程中,允许存在多个相同名称的命名空间,编译器最后会将其合并成一个命名空间。2.一个命名空间就定义了一个新的作用域,命名空间中的所有内容都局限于该命名空间中。
2.命名空间的使用
namespace ads
{
int a = 10;
int Add(int a, int b)
{
return a + b;
}
struct Node
{
int val;
struct Node* next;
};
}
int main()
{
printf("rand = %d\n", a);
return 0;
}
当运行上述代码时,会报错:。因此在使用命名空间内的成员时,我们有三种方法:
//1.使用作用域限定符调用
//形式:命名空间名称::调用的变量或函数
int main()
{
printf("rand = %d\n", ads::a);
return 0;
}
//2.使用using将命名空间中的某个成员引入
using ads::a
int main()
{
printf("rand = %d\n", a);
return 0;
}
//3.使用using函数直接将命名空间内全部变量引入
using namespace ads
int main()
{
printf("rand = %d\n", a);
return 0;
}
二、C++的输入以及输出
在C语言中,我们使用scanf和printf来进行输入和输出,如:
#include<stdio.h>
int main()
{
printf("hello world\n");
return 0;
}
而在C++中,我们使用cin和cout函数进行输入输出,在使用cin和cout函数时,必须要包含头文件<iostream>以及按照命名空间的方式来使用std,如:
#include<iostream>
using namespace std; //std是C++标准库的命名空间名
//C++将标准库的定义实现都放到这个命名空间中
int main()
{
cout << "hello world" << endl;//endl在C++中表示换行,与\n相同
return 0; //'<<'是流插入运算符,'>>'是流提取运算符
}
C++的输入和输出相比C语言的scanf和printf更加的方便,cin和cout在输入输出时不需要手动输入格式,他可以自动识别变量类型。
注:std是C++标准库的命名空间,在日常练习中,我们可以直接用using namespace std直接展开,方便使用。但在项目开发中,我们应避免全部展开,因为如果我们定义的对象和库中重名的类型、对象和函数,就会发生冲突问题。因此我们可以使用std::cout或using std::cout展开常用的库对象、类型等。
三、缺省参数
3.1缺省参数的概念
缺省参数是声明或定义函数时为函数的参数指定的一个缺省值。在调用该函数时,如果没有指定实参,那就采用该形参的缺省值;若指定了实参,则用实参。代码如:
int Add(int a = 0, int b = 2)
{
return a + b;
}
int main()
{
int sum = Add();//没有实参时,使用形参
cout << "Add() = " << sum << endl;
sum = Add(2, 3);//有实参时,使用实参
cout << "Add(2,3) = " << sum << endl;
return 0;
}
运行结果:
3.2缺省参数的分类
- 全缺省参数
void Func(int a = 1, int b = 2, int c = 3)
{
cout << "a = " << a << endl;
cout << "b = " << b << endl;
cout << "c = " << c << endl;
}
- 半缺省参数(部分缺省参数)
//半缺省参数必须从右往左依次给出,不能间隔着给
void Func(int a, int b = 2, int c = 3)
{
cout << "a = " << a << endl;
cout << "b = " << b << endl;
cout << "c = " << c << endl;
}
缺省参数不能在函数声明和函数定义中同时出现,并且缺省参数只能出现在函数声明中,不能出现在函数定义中 。
缺省值必须是常量或全局变量