《C++探幽:命名空间、输入&输出、缺省参数》

学好 C++,首先需要了解其基础语法,掌握变量、数据类型、运算符等基本概念。接着深入学习程序结构,包括函数、控制流程语句和循环,这是编程的基石。然后认真学习面向对象编程(OOP)核心概念,如类、对象、继承、多态等,理解 C++ 如何通过这些构建复杂程序。同时,实践是关键,通过编写程序巩固所学知识。遇到问题时,查阅资料、参与社区讨论或提问是很好的学习方式。此外,阅读经典的 C++ 教程或书籍,也可系统提升编程水平。

目录

一.命名空间

1.1、namespace的价值

1.2、namespace的定义

1.3、命名空间的使用

二.C++输入&输出

三.缺省参数


一.命名空间

在C++中,名称可以是变量、函数、结构、枚举、类以及类的结构和成员。但随着项目的增大,名称冲突的可能性也将增大。使用多个厂商的类库时,可能导致名称冲突。例如:两个库都定义了名为List、Node、Tree的类,但定义的方法不兼容。用户可能希望使用一个库的List类,而使用另一个库的Node类。这种冲突被称为名称空间问题。

1.1、namespace的价值

在传统C/C++中,变量、函数和类都是大量存在的,这些变量、函数和类都将存在于全局域中,可能会导致很多冲突。

使用命名空间的目的是对标识符的名称进行本地化,来避免名称冲突或名字污染,namespace的的出现就是为了解决这种问题的。

c语言项目类似于下面程序的命名冲突就是普遍存在的问题,C++引入namespace就是为了更好的解决这样的问题:

#include
#include


int rand = 0;

int main()
{
   //编译器报错:error C2356:“rand”重定义;
   printf("%d",rand);
   return 0;
}

1.2、namespace的定义

  • 定义命名空间,需要使用namespace关键字,后面跟命名空间的名字,然后接一对{ }即可。
  • { }中是该命名空间的成员。在这之间可以定义函数、变量、类型等。
  • C++中域有函数局部域、全局域、类域、命名空间域;域影响的是编译时查找一个函数/变量等的逻辑,所以有了域隔离,名称冲突就解决了。局部域和全局域除了会影响编译查找逻辑,还会影响变量的生命周期,命名空间域和类域不影响变量生命周期。
  • namespace本质是定义出一个域,这个域跟全局域各自独立,不同的域可以定义同名的变量,所以下面的rand不冲突了。
#include
#include

namespace sapce
{
   int Add(int a,int b)
   {
       return a + b;
   }
   
   int rand = 10;

}

int main()
{
   printf("%d",rand);
   int ret = Add(1,2)
   printf("%d",ret);
   return 0;

}
  • namespace只能定义在全局,且可以嵌套定义。
  • 项目工程中多文件定义时定义的同名命名空间会自动合并为一个,不会冲突。
  • C++标准库都放在一个叫std(standard)的命名空间中。
namespace HAHA
{
   int a = 0;
   int b = 20;

   namespace  HEIHEI
   {
      int a = 10;
      int b = 100;
   }
}

1.3、命名空间的使用

编译查找一个变量声明/定义时,默认只会在局部域或者全局查找,不会再命名空间里查找。我们要使用命名空间的的成员有以下三种方式:

  1. 指定命名空间,在项目中推荐。
  2. using将命名空间某个成员展开,项目中经常访问的不存在冲突的成员推荐这种方式。
  3. 展开命名空间,刷题时推荐。

二.C++输入&输出

  •  是 Input Output Stream 的缩写,是标准的输入、输出流库,定义了标准的输⼊、输 出对象。 std::cin 是 istream 类的对象,它主要面向窄字符(narrow characters (of type char))的标准输入流。
  •  std: :cout 是 ostream 类的对象,它主要面向窄字符的标准输出流。
  •  std: :endl 是⼀个函数,流插入输出时,相当于插入一个换行字符加入刷新缓冲区。
  • • >>是流提取运算符。(C语言还用这两个运算符做位运算左移/右移)
  •  使用C++输入输出更方便,不需要像printf/scanf输⼊输出时那样,需要手动指定格式,C++的输入输出可以自动识别变量类型(本质是通过函数重载实现的),其实最重要的是 C++的流能更好的支持自定义类型对象的输⼊输出。
  •  IO流涉及类和对象,运算符重载、继承等很多⾯向对象的知识。
  •  cout/cin/endl等都属于C++标准库,C++标准库都放在⼀个叫std(standard)的命名空间中,所以要 通过命名空间的使用方式去用他们。
  • ⼀般日常练习中我们可以using namespace std,实际项目开发中不建议using namespace std。
  • 这里我们没有包含,也可以使用printf和scanf,在包含iostream间接包含了。vs系列编译器是这样的,其他编译器可能会报错。

三.缺省参数

  • 缺省参数是声明或定义函数时为函数的参数指定⼀个缺省值。在调用该函数时,如果没有指定实参则采用该形参的缺省值,否则使用指定的实参,缺省参数分为全缺省半缺省参数。(有些地方把 缺省参数也叫默认参数)
  • 全缺省就是全部形参给缺省值,半缺省就是部分形参给缺省值。C++规定半缺省参数必须从右往左依次连续缺省,不能间隔跳跃给缺省值。
  • 带缺省参数的函数调用,C++规定必须从左到右依次给实参,不能跳跃给实参。
  • 函数声明和定义分离时,缺省参数不能在函数声明和定义中同时出现,规定必须函数声明给缺省值。
#include 
#include 

using namespace std;

void Func(int a = 0)
{
   cout << a << endl;
}
int main()
{
   Func(); // 没有传参时,使⽤参数的默认值
   Func(10); // 传参时,使⽤指定的实参
   return 0;
}
#include 
using namespace std;
// 全缺省
void Func1(int a = 10, int b = 20, int c = 30)
{
   cout << "a = " << a << endl;
   cout << "b = " << b << endl;
   cout << "c = " << c << endl << endl;
}
// 半缺省
void Func2(int a, int b = 10, int c = 20)
{
   cout << "a = " << a << endl;
   cout << "b = " << b << endl;
   cout << "c = " << c << endl << endl;
}
int main()
{
   Func1();
   Func1(1);
   Func1(1,2);
   Func1(1,2,3);
   Func2(100);
   Func2(100, 200);
   Func2(100, 200, 300);
   return 0;
}

你可能感兴趣的:(c++,c++,开发语言)