C++初阶(命名空间+缺省参数+const总结+引用总结+内联函数+auto关键字)
作者:互联网
概述
在C/C++中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染,namespace关键字的出现就是针对这种问题的。
举个例子:
#include <stdio.h>
#include <stdlib.h>
int rand = 10;
int main()
{
printf("%d", rand);
return 0;
}
程序编译的结果显示rand重定义了,为什么会这样呢?因为在stdlib.h这个头文件中已经定义了rand这样一个函数,这样就导致了编译器不知道这是一个函数还是一个变量,C语言中无法应对这种冲突,只能通过改名字来避免。
而C++为了解决这个问题,引入了命名空间的概念。
命名空间的定义
定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}中即为命名空间的成员。
//命名空间
//A就是命名空间的名字
namespace A{
int a;
void func()
{}
}
注意事项:
- 命名空间只能写在全局
- 命名空间可以嵌套命名空间
- 命名空间是开放的,随时可以加入新的成员,但是新加入的成员只能在加入后使用
- 匿名命名空间就类似于static
- 命名空间可以取别名
- 分文件编写的时候,如果头文件有两个命名空间,但是里面的成员函数或者成员变量同名的时候,在cpp重实现函数需要加上命名空间
接下来给一个完整的代码块来展示命名空间的注意事项和使用:
#include<iostream> //引入头文件
#include<string>//C++中的字符串
using namespace std; //标准命名空间
//A就是命名空间的名字
namespace A
{
//命名空间内既可以定义变量也可以定义函数
int rand = 10;
int Sub(int x, int y)
{
return x + y;
}
struct ListNode
{
int data;
struct ListNode* next;
};
}
//命名空间的嵌套定义
namespace B
{
int rand;
namespace C
{
int rand;
}
}
//命名空间是开放的,随时可以加入新成员,但是新成员只能在加入后使用
namespace B
{
int c;//此时c会合并到命名空间B中,实际上就是个合并的过程
}
//匿名命名空间
namespace
{
int d = 5;//命名空间没有名字,就类似于static int d = 50,是个静态全局变量,别的文件无法使用
}
int main()
{
//命名空间的使用
//1.::作用域限定符
//访问A空间的Sub函数
cout << A::Sub(10, 20) << endl;
//2.访问嵌套空间
//访问B空间的C空间的rand变量
B::C::rand = 5;
cout << B::C::rand << endl;
system("pause");
return EXIT_SUCCESS;
}
using关键字
引入using关键字之后,命名空间的使用又变得不一样
- 用using将命名空间的成员引入
namespace A
{
int a = 10;
}
void test01()
{
//using声明的意思就是让命名空间中某个标识符可以直接使用
using A::a;
cout<<a<<endl;
}
注意:
1.使用using声明,就不会每次写A::a了,直接用a就可以
2.using A::a声明的意思就是把变量a又在test函数中定义了一次,此时如果在test内部再定义一个int a;就会出错
- 用using namespace 命名空间名称引入
namespace A
{
int a = 10;
}
using namespace A;
void test01()
{
cout<<a<<endl;
}
使用using关键字修饰namespace整个命名空间,实际上就是脱去了这个命名空间的外衣,就等价于你定义了一个int a在全局
思考一个问题:下面代码有错吗?
在test01函数体内又定义了一个int a,会报错么?如果不报错,那么输出的是全局的 a = 10 还是局部的a = 20?
namespace A
{
int a = 10;
}
using namespace A;
void test01()
{
int a = 20;
cout<<a<<endl;
}
答案是不会报错,输出的是局部的20,因为命名空间A内部的变量a在使用using关键字后相当于在全局定义了一个int a ;而在函数体内定义一个局部的 int a;两个变量的作用域不同,是可以定义同名变量的,输出的是局部变量的值,小伙伴的要注意区分~
C++输入和输出
- C语言用的是printf和scanf进行输入和输出的。那么C++是用什么来进行输入输出的呢?
- C++用到的是cout(控制台)和cin(键盘)两个函数进行操作,使用是必须包含iostream的头文件及 std标准命名空间。
- C++头文件不带.h,将std标准命名空间进行展开。