【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语言不支持缺省(编译器不支持)


相关文章
|
23天前
|
程序员 C++
C++中的函数重载有什么作用
【10月更文挑战第19天】C++中的函数重载有什么作用
17 3
|
1月前
|
存储 安全 编译器
【C++】C++特性揭秘:引用与内联函数 | auto关键字与for循环 | 指针空值(一)
【C++】C++特性揭秘:引用与内联函数 | auto关键字与for循环 | 指针空值
|
1月前
|
安全 程序员 编译器
【C++】如何巧妙运用C++命名空间:初学者必备指南
【C++】如何巧妙运用C++命名空间:初学者必备指南
|
23天前
|
编译器 程序员 C++
C++中的函数重载是什么
【10月更文挑战第19天】C++中的函数重载是什么
19 0
|
1月前
|
存储 编译器 程序员
【C++】C++特性揭秘:引用与内联函数 | auto关键字与for循环 | 指针空值(二)
【C++】C++特性揭秘:引用与内联函数 | auto关键字与for循环 | 指针空值
|
1月前
|
自然语言处理 编译器 Linux
【C++】巧用缺省参数与函数重载:提升编程效率的秘密武器
【C++】巧用缺省参数与函数重载:提升编程效率的秘密武器
|
1月前
|
程序员 C++ 开发者
C++入门教程:掌握函数重载、引用与内联函数的概念
通过上述介绍和实例,我们可以看到,函数重载提供了多态性;引用提高了函数调用的效率和便捷性;内联函数则在保证代码清晰的同时,提高了程序的运行效率。掌握这些概念,对于初学者来说是非常重要的,它们是提升C++编程技能的基石。
21 0
|
2月前
|
程序员 C++ 容器
C++编程基础:命名空间、输入输出与默认参数
命名空间、输入输出和函数默认参数是C++编程中的基础概念。合理地使用这些特性能够使代码更加清晰、模块化和易于管理。理解并掌握这些基础知识,对于每一个C++程序员来说都是非常重要的。通过上述介绍和示例,希望能够帮助你更好地理解和运用这些C++的基础特性。
41 0
|
6天前
|
存储 编译器 C++
【c++】类和对象(中)(构造函数、析构函数、拷贝构造、赋值重载)
本文深入探讨了C++类的默认成员函数,包括构造函数、析构函数、拷贝构造函数和赋值重载。构造函数用于对象的初始化,析构函数用于对象销毁时的资源清理,拷贝构造函数用于对象的拷贝,赋值重载用于已存在对象的赋值。文章详细介绍了每个函数的特点、使用方法及注意事项,并提供了代码示例。这些默认成员函数确保了资源的正确管理和对象状态的维护。
29 4
|
7天前
|
存储 编译器 Linux
【c++】类和对象(上)(类的定义格式、访问限定符、类域、类的实例化、对象的内存大小、this指针)
本文介绍了C++中的类和对象,包括类的概念、定义格式、访问限定符、类域、对象的创建及内存大小、以及this指针。通过示例代码详细解释了类的定义、成员函数和成员变量的作用,以及如何使用访问限定符控制成员的访问权限。此外,还讨论了对象的内存分配规则和this指针的使用场景,帮助读者深入理解面向对象编程的核心概念。
26 4