【C++】-- 命名空间、函数重载、内联函数(一)

简介: 【C++】-- 命名空间、函数重载、内联函数

一、命名空间

C++中存在大量的变量、函数和类,都存在于全局作用域中,会导致冲突。使用命名空间可以对标识符的名称进行本地化,来避免命名冲突或名字污染,达到名称隔离的目的。


1.命名空间的定义

C++使用namespace关键字定义命名空间,用来解决命名冲突问题,格式为:namespace后面跟命名空间名字,再接一对{ } ,{ }中是命名空间的成员。

(1)命名空间格式:

1. namespace N1 //N1是命名空间的名称
2. {
3.  //命名空间的内容,既可以定义变量,也可以定义函数
4.  int a = 0;
5. 
6.  int Add(int left, int right)
7.  {
8.    return left + right;
9.  }
10. }

(2)命名空间可嵌套:

1. namespace N2 //N2命名空间中嵌套了N3命名空间
2. {
3.  int a = 0;
4.  int b = 0;
5. 
6.  int Add(int left, int right)
7.  {
8.    return left + right;
9.  }
10. 
11.   namespace N3
12.   {
13.     int c;
14.     int d;
15. 
16.     int sub(int left, int right)
17.     {
18.       return left - right;
19.     }
20.   }
21. }

(3)同一个工程中允许存在多个同名命名空间,编译器会合成到同一个命名空间中,如:

001-test.cpp中存在N1命名空间

“::”操作符是域解析操作符

1. #include<iostream>
2. using namespace std;
3. namespace N1 //N1是命名空间的名称
4. {
5.  //命名空间的内容,既可以定义变量,也可以定义函数
6.  int e;
7. 
8.  int Add(int left, int right)
9.  {
10.     return left + right;
11.   }
12. }
13. 
14. int main()
15. {
16.   cout <<"e="<< N1::e << endl;//endl是全局换行符
17.     return 0;
18. }

002-test.cpp中也存在N1命名空间

1. #include<iostream>
2. namespace N1 //N2命名空间中嵌套了N3命名空间
3. {
4.  int b = 0;
5.  int c = 8;
6. 
7.  namespace N3
8.  {
9.    int c;
10.     int d;
11. 
12.     int sub(int left, int right)
13.     {
14.       return left - right;
15.     }
16.   }
17. }

注意:

(1)同一命名空间不能定义相同的变量名和函数名。

(2)一个命名空间定义了一个新的作用域,命名空间中的所有内容都局限于该命名空间中。

(3)C++为了防止命名冲突,把自己库里面的东西都定义在std命名空间中。


2.命名空间的3种使用方式

(1) 加命名空间名称及作用域限定符(N::a),比较麻烦,每个用到域中成员的地方都得指定成员的域

1. #include<iostream>
2. using namespace std;
3. 
4. namespace N
5. {
6.  int a = 0;
7. 
8.  int Add(int left, int right)
9.  {
10.     return left + right;
11.   }
12.   int Sub(int left, int right)
13.   {
14.     return left - right;
15.   }
16. 
17.   namespace N1  //定义嵌套命名空间
18.   {
19.     int max(int left, int right)
20.     {
21.       return left > right ? left : right;
22.     }
23.   }
24. }
25. 
26. int main()
27. {
28.   cout << "a = " << N::a << endl;
29. 
30.     //嵌套命名空间的使用
31.   int b = N::N1::max(3, 4);
32.   cout << "b = " << b << endl;
33. 
34.     return 0;
35. }

(2)是用using将命名空间成员或函数引入(using N::a,访问a时就不需要加访问限定符"::")

1. #include<iostream>
2. using namespace std;
3. 
4. namespace N
5. {
6.  int a = 0;
7. 
8.  int Add(int left, int right)
9.  {
10.     return left + right;
11.   }
12.   int Sub(int left, int right)
13.   {
14.     return left - right;
15.   }
16. }
17. 
18. using N::a;
19. 
20. int main()
21. {
22.   cout << "a = " << a << endl;
23.     return 0;
24. }

(3)使用using namespace 命名空间名称引入(using namespace N,访问a时就不需要加访问限定符"::")

1. #include<iostream>
2. using namespace std;
3. 
4. namespace N
5. {
6.  int a = 0;
7. 
8.  int Add(int left, int right)
9.  {
10.     return left + right;
11.   }
12.   int Sub(int left, int right)
13.   {
14.     return left - right;
15.   }
16. }
17. 
18. using namespace N;
19. 
20. int main()
21. {
22.   cout << "a = " << a << endl;
23.     return 0;
24. }

对于std命名空间,如果使用using namespace 命名空间名称将std整个引入,那么库里面的东西全都被展开包含到全局了,虽然看起来方便,但是如果自己定义的内容和库冲突了,就没法解决了。所以日常练习可以使用using namespace std的方式引入std命名空间,规范的工程项目中不推荐。

using namespace std;

可以展开常用的命名空间,下面代码只用到打印,只展开cout和endl命名空间来代替展开std:

1. #include<iostream>
2. using  std::cout;
3. using  std::endl;
4. 
5. namespace N
6. {
7.  int a = 0;
8. 
9.  int Add(int left, int right)
10.   {
11.     return left + right;
12.   }
13.   int Sub(int left, int right)
14.   {
15.     return left - right;
16.   }
17. }
18. 
19. using N::a;
20. 
21. int main()
22. {
23.   cout << "a = " << a << endl;
24.     return 0;
25. }

使用cout和endl时,也可以不使用using nampspace 命名空间,直接指定成员所在的域

1. #include<iostream>
2. 
3. namespace N
4. {
5.  int a = 0;
6. 
7.  int Add(int left, int right)
8.  {
9.    return left + right;
10.   }
11.   int Sub(int left, int right)
12.   {
13.     return left - right;
14.   }
15. }
16. 
17. using N::a;
18. 
19. int main()
20. {
21.   std::cout << "a = " << a << std::endl;
22.   return 0;
23. }

二、C++输入输出

1.使用cout标准输出(控制台)和cin标准输入(键盘)时,必须要包含< iostream >头文件及std标准命名空间:

1. #include<iostream>
2. using namespace std;

2.c++可以自动识别类型,不需要增加数据格式控制。C语言必须要指定数据格式:整型--%d,字符--%c。

1. #include<iostream>
2. using namespace std;
3. 
4. int main()
5. {
6.     int a;
7.     double b;
8.     char c;
9. 
10.     cin >> a;
11.     cin >> b >> c;
12. 
13.     cout << a << endl;
14.     cout << b << " " << c << endl;
15. 
16.     return 0;
17. }


三、缺省参数

1.缺省参数定义

缺省参数是声明或定义函数时为函数的参数指定一个默认值。在调用该函数时,如果没有指定实参则采用该默认值,否则使用给定的实参。

1. #include<iostream>
2. using namespace std;
3. 
4. void TestFunc(int a = 0)
5. {
6.  cout << a << endl;
7. }
8. 
9. int main()
10. {
11.   TestFunc();    //未给定实参
12.   TestFunc(10);  //给定实参
13.   return 0;
14. }

2.缺省参数分类

(1)全缺省参数:在函数声明或定义时为所有参数都指定一个默认值,调用函数时只给传了实参的参数赋值为实参,否则为默认值:

1. #include<iostream>
2. using namespace std;
3. 
4. void TestFunc(int a = 0, int b = 10, int c = 20)
5. {
6.  cout << a << endl;
7.  cout << b << endl;
8.  cout << c << endl;
9. 
10.   cout << "\n" << endl;
11. }
12. 
13. int main()
14. {
15.   TestFunc(3);
16.   TestFunc(3,4);
17.   TestFunc(3, 4, 5);
18. 
19.   return 0;
20. }

(2)半缺省参数:在函数声明或定义时从右向左为部分参数指定一个默认值,且不能间隔给出

1. #include<iostream>
2. using namespace std;
3. 
4. //void TestFunc(int a = 10, int b, int c = 20)间隔给出默认值,错误
5. //void TestFunc(int a = 10, int b, int c)从左向右给出默认值,错误
6. void TestFunc(int a, int b = 10, int c = 20)
7. {
8.  cout << a << endl;
9.  cout << b << endl;
10.   cout << c << endl;
11. 
12.   cout << "\n" << endl;
13. }
14. 
15. int main()
16. {
17.   TestFunc(3);
18.   TestFunc(3,4);
19.   TestFunc(3, 4, 5);
20. 
21.   return 0;
22. }

注意:

(1)缺省参数不能在函数声明和定义中同时出现。

(2)缺省值必须是常量或者全局变量

(3)C语言不支持缺省(编译器不支持)


相关文章
|
11天前
|
C++
C++命名空间(namespace)的使用
C++命名空间(namespace)的使用
|
13天前
|
存储 编译器 C语言
【C++入门】—— C++入门 (下)_内联函数
【C++入门】—— C++入门 (下)_内联函数
13 2
|
13天前
|
人工智能 安全 编译器
【C++入门】—— C++入门 (上)_命名空间
【C++入门】—— C++入门 (上)_命名空间
16 2
|
2天前
|
Unix 编译器 C语言
【C++航海王:追寻罗杰的编程之路】关键字、命名空间、输入输出、缺省、重载汇总
【C++航海王:追寻罗杰的编程之路】关键字、命名空间、输入输出、缺省、重载汇总
5 0
|
3天前
|
存储 安全 编译器
【C++】:函数重载,引用,内联函数,auto关键字,基于范围的for循环,nullptr关键字
【C++】:函数重载,引用,内联函数,auto关键字,基于范围的for循环,nullptr关键字
10 0
|
3天前
|
编译器 C语言 C++
【C++】:C++关键字,命名空间,输入&输出,缺省参数
【C++】:C++关键字,命名空间,输入&输出,缺省参数
10 0
|
9天前
|
编译器 C++
C++对C的改进和拓展\域解析符、形参默认值、函数重载
C++对C的改进和拓展\域解析符、形参默认值、函数重载
7 0
|
3天前
|
安全 编译器 C++
【C++】学习笔记——类和对象_5
【C++】学习笔记——类和对象_5
17 9
|
2天前
|
存储 编译器 C语言
【C++航海王:追寻罗杰的编程之路】类与对象你学会了吗?(上)
【C++航海王:追寻罗杰的编程之路】类与对象你学会了吗?(上)
8 2
|
2天前
|
C++
C++职工管理系统(类继承、文件、指针操作、中文乱码解决)
C++职工管理系统(类继承、文件、指针操作、中文乱码解决)
2 0
C++职工管理系统(类继承、文件、指针操作、中文乱码解决)