C++——命名空间,输入输出,缺省参数

简介: ✅<1>主页:我的代码爱吃辣📃<2>知识讲解:C++🔥<3>创作者:我的代码爱吃辣☂️<4>开发环境:Visual Studio 2022💬<5>前言:补充C语言语法的不足,以及C++是如何对C语言设计不合理的地方进行优化的,比如:作用域方面、IO方面、函数方面、指针方面、宏方面等。

一.命名空间

在C/C++中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存

在于全局作用域中,可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化,

以避免命名冲突或名字污染,namespace关键字的出现就是针对这种问题的。

例如:

#include<stdio.h>
int rand = 10;
int main()
{
  int a = 10;
  return 0;
}

这时候代码没有任何问题。

#include<stdio.h>
#include<stdlib.h>
int rand = 10;
int main()
{
  int a = 10;
  return 0;
}

出现这个问题,我们知道,在头文件<stdlib.h>里面有一个函数rand(),所以头文件展开后就会出现定义冲突的现象。在C++中为了避免这种,利用命名空间。

(1)命名空间的定义

定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}
中即为命名空间的成员。

#include<stdio.h>
namespace ytt
{
  int a = 5;
}
int a = 10;
int main()
{
  printf("%d", a);
  return 0;
}



这样就不会有定义冲突的问题了,那如果我们想访问,值为5的那个变量a,又要怎么办呢?

(2)命名空间的使用



如果直接访问是访问不到的。

1.访问方法

命名空间的名称 +  :: + 命名空间内的变量或者函数。

namespace ytt
{
  int a = 5;
  int Add(int a, int b)
  {
    return a + b;
  }
}
int main()
{
  printf("a=%d\n", ytt::a);
  printf("4+5=%d\n", ytt::Add(4 , 5));
  return 0;
}



2.命名空间的嵌套

namespace ytt
{
  int Add(int a, int b)
  {
    return a + b;
  }
  namespace wq
  {
    int Max(int a, int b)
    {
      return a > b ? a : b;
    }
  }
}
int main()
{
  printf("Max=%d\n", ytt::wq::Max(10, 15));
  return 0;
}

嵌套的情况下,就是一层一层访问:



(3)全局域

访问全局域,只需要 :: +  全局变量

namespace ytt
{
  int a = 10;
}
int a = 5;
int main()
{
  int a = 1;
  //局部a
  printf("a=%d\n", a);
  //全局a
  printf("a=%d\n", ytt::a);
  //命名空间内的a
  printf("a=%d\n", ::a);
  return 0;
}



二.输入&&输出

C++的输入输出是函数:cin,cout,被包含在头文件 <iostream> 中。

(1) cout

#include<iostream>
int main()
{
  std::cout << "hello world" << std:: endl;
  std::cout << "hello world\n";
    return 0;
}

<<是流插入运算符

有了前面,命名空间的学习,我们也就能看出来了,cout 也是被封装到命名空间 std里面的,endl 是封装在 std 里面的换行符,和 ' \n '是一样的。



(2)cin

#include<iostream>
int main()
{
  int a = 0;
  std::cin >> a;
  std::cout << "a = " << a;
    return 0;
}

>>是流提取运算符,cin 也是被封装到命名空间 std里面的。


3003c7fcb8254b16a0430004007d312d.png


实际上cout和cin分别是 ostream 和 istream 类型的对象,>>和<<也涉及运算符重载等知识,

这些知识我们我们后续才会学习,所以我们这里只是简单学习他们的使用。后面我们还有有

一个章节更深入的学习IO流用法及原理。  

(3)cin cout自动是识别类型

cin cout 相对于 C语言的scnaf printf,少了类型的修饰,所以在C++中,cin 和 cout是可以自动识别类型的。

int main()
{
  int a = 0;
  double b = 0;
  char c = 0;
  std::cin >> a >> b >> c;
  std::cout << a <<std::endl;
  std::cout << b << std::endl; 
  std::cout << c << std::endl;
  return 0;
}



三.命名空间的展开

(1)使用using namespace 命名空间名称引入

我们在写程序的时候,有时候会发生,某个命名空间的变量名,函数名,经常被使用,我们每一次使用都要加上命名空间,会非常麻烦。所以我们使用using namespace 命名空间名称引入。

#include<iostream>
namespace ytt
{
  int a = 0;
  int b = 2;
}
using namespace ytt;
using namespace std;
int main()
{
  cout << a << endl;
  cout << b << endl;
    return 0;
}

这样使用就是将命名空间的所有定义全部展开,这样虽然使得我们不用每次都去包含命名空间,到那时也使得我们辛辛苦苦建立的命名空间也就没有了意义。因为都在这里展开了,就会发生定义相同的冲突。所以这种使用方法在企业开发时禁止的,我们平时练习代码时,为了方便可以使用。


(2)使用using将命名空间中某个成员引入

上述使用使用using namespace 将整个命名空间展开,会有造成冲突的可能,我们还可以将命名空间的某一成员引入。

#include<iostream>
namespace ytt
{
  int a = 0;
  int b = 2;
}
using ytt::a;
using ytt::b;
using std::cout;
using std::endl;
int main()
{
  cout << a << endl;
  cout << b << endl;
    return 0;
}


四.缺省参数

(1)缺省参数概念

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

#include<iostream>
using std::cout;
using std::endl;
void fun(int a = 10)
{
  cout << a << endl;
}
int main()
{
  fun();  //没传参数,使用缺省参数
  fun(100);//传了参数,就使用传的参数
  return 0;
}



(2)缺省参数分类

1.全缺省参数

void Func(int a = 10, int b = 20, int c = 30)
{
    cout<<"a = "<<a<<endl;
    cout<<"b = "<<b<<endl;
    cout<<"c = "<<c<<endl;
}

调用时:

void Func(int a = 10, int b = 20, int c = 30)
{
  cout << "a = " << a << endl;
  cout << "b = " << b << endl;
  cout << "c = " << c << endl;
}
int main()
{
  Func();         //true
  Func(1);        //true
  Func(1, 2);     //true
  Func(1, 2, 3);  //true
  Func(, 1, 2);   //error
    Func(1, , 3);   //error
  return 0;
}

带有缺省参数的函数,传参数时必须从左往右连续,不能跳着给参数。

2.半缺省参数

void Func(int a, int b = 10, int c = 20)
{
    cout<<"a = "<<a<<endl;
    cout<<"b = "<<b<<endl;
    cout<<"c = "<<c<<endl;
}

3.注意:

1. 半缺省参数必须从右往左依次来给出,不能间隔着给
2. 缺省参数不能在函数声明和定义中同时出现

#include<iostream>
using std::cout;
using std::endl;
//函数声明
void Func(int a = 10, int b = 20, int c = 30);
int main()
{
  Func();         //true
  return 0;
}
//函数定义
void Func(int a = 10, int b = 20, int c = 30)
{
  cout << "a = " << a << endl;
  cout << "b = " << b << endl;
  cout << "c = " << c << endl;
}



3. 缺省值必须是常量或者全局变量


五.最后

博学之,审问之,慎思之,明辨之,笃行之。——《礼记》

相关文章
|
2月前
|
安全 程序员 编译器
【C++】如何巧妙运用C++命名空间:初学者必备指南
【C++】如何巧妙运用C++命名空间:初学者必备指南
|
2月前
|
自然语言处理 编译器 Linux
【C++】巧用缺省参数与函数重载:提升编程效率的秘密武器
【C++】巧用缺省参数与函数重载:提升编程效率的秘密武器
|
4月前
|
程序员 C++ 开发者
C++命名空间揭秘:一招解决全局冲突,让你的代码模块化战斗值飙升!
【8月更文挑战第22天】在C++中,命名空间是解决命名冲突的关键机制,它帮助开发者组织代码并提升可维护性。本文通过一个图形库开发案例,展示了如何利用命名空间避免圆形和矩形类间的命名冲突。通过定义和实现这些类,并在主函数中使用命名空间创建对象及调用方法,我们不仅解决了冲突问题,还提高了代码的模块化程度和组织结构。这为实际项目开发提供了宝贵的参考经验。
68 2
|
3月前
|
程序员 C++ 容器
C++编程基础:命名空间、输入输出与默认参数
命名空间、输入输出和函数默认参数是C++编程中的基础概念。合理地使用这些特性能够使代码更加清晰、模块化和易于管理。理解并掌握这些基础知识,对于每一个C++程序员来说都是非常重要的。通过上述介绍和示例,希望能够帮助你更好地理解和运用这些C++的基础特性。
47 0
|
4月前
|
编译器 C语言 C++
C++入门 | 命名空间、输入输出、缺省参数
C++入门 | 命名空间、输入输出、缺省参数
51 4
|
3月前
|
C语言 C++
C++(六)Namespace 命名空间
命名空间(Namespace)是为了解决大型项目中命名冲突而引入的机制。在多库集成时,不同类库可能包含同名函数或变量,导致冲突。C++通过语法形式定义了全局无名命名空间,并允许对全局函数和变量进行作用域划分。命名空间支持嵌套与合并,便于协同开发。其使用需谨慎处理同名冲突。
|
20天前
|
存储 编译器 C语言
【c++丨STL】string类的使用
本文介绍了C++中`string`类的基本概念及其主要接口。`string`类在C++标准库中扮演着重要角色,它提供了比C语言中字符串处理函数更丰富、安全和便捷的功能。文章详细讲解了`string`类的构造函数、赋值运算符、容量管理接口、元素访问及遍历方法、字符串修改操作、字符串运算接口、常量成员和非成员函数等内容。通过实例演示了如何使用这些接口进行字符串的创建、修改、查找和比较等操作,帮助读者更好地理解和掌握`string`类的应用。
30 2
|
26天前
|
存储 编译器 C++
【c++】类和对象(下)(取地址运算符重载、深究构造函数、类型转换、static修饰成员、友元、内部类、匿名对象)
本文介绍了C++中类和对象的高级特性,包括取地址运算符重载、构造函数的初始化列表、类型转换、static修饰成员、友元、内部类及匿名对象等内容。文章详细解释了每个概念的使用方法和注意事项,帮助读者深入了解C++面向对象编程的核心机制。
66 5
|
1月前
|
存储 编译器 C++
【c++】类和对象(中)(构造函数、析构函数、拷贝构造、赋值重载)
本文深入探讨了C++类的默认成员函数,包括构造函数、析构函数、拷贝构造函数和赋值重载。构造函数用于对象的初始化,析构函数用于对象销毁时的资源清理,拷贝构造函数用于对象的拷贝,赋值重载用于已存在对象的赋值。文章详细介绍了每个函数的特点、使用方法及注意事项,并提供了代码示例。这些默认成员函数确保了资源的正确管理和对象状态的维护。
70 4
|
1月前
|
存储 编译器 Linux
【c++】类和对象(上)(类的定义格式、访问限定符、类域、类的实例化、对象的内存大小、this指针)
本文介绍了C++中的类和对象,包括类的概念、定义格式、访问限定符、类域、对象的创建及内存大小、以及this指针。通过示例代码详细解释了类的定义、成员函数和成员变量的作用,以及如何使用访问限定符控制成员的访问权限。此外,还讨论了对象的内存分配规则和this指针的使用场景,帮助读者深入理解面向对象编程的核心概念。
80 4