关注小庄 顿顿解馋(ᕑᗢᓫ∗)˒
引言:本篇博客我们开始与C++的第一次约会,C++是兼容c的,本篇博客我们将了解到C++关键字有哪些,C++命名空间,C++输入与输出和缺省参数的内容,请放心食用 ~
文章目录
- 一 🏠 C++关键字
 - 二 🏠 C++命名空间
 - 👿 命名空间的定义
 - 👿 命名空间的使用
 - 📒 加命名空间名称及作用域限定符
 - 📒 展开命名空间
 - 📒 指定展开空间的某一个
 
- 三 🏠 C++输入与输出
 - 👿 cout和cin
 - 关于std命名空间
 
- 四 🏠 缺省参数
 - 👿 缺省参数的概念
 - 👿 缺省参数的分类
 
一 🏠 C++关键字
C++跟C语言一样也有属于它自己关键字,但是由于C++兼容c,关键字中有些是我们的老朋友,有些是新朋友,我们可以在后期慢慢了解
 
二 🏠 C++命名空间
我们首先看这样的一段代码
#include<stdlib.h>
#include<stdio.h>
int rand = 0;
int main()
{
   printf("%d",rand);
   return 0;
}
 
这段代码能否正常输出这个全局变量rand的值呢?
答案是否定的,这是因为我们包含了rand函数的头文件,他和rand变量都在全局域中,这导致编译器懵逼了会起冲突。
这里我们补充一个知识点:
我们在用变量/函数..时,编译器默认查找顺序是1.局部域 2.全局域
那有什么解决之法呢 ? C++ 给了一个新技术叫做 命名空间(namespace)
👿 命名空间的定义
- 语法
 
namespace 空间名
{
   int rand = 10; // 定义变量
   int Add(int x,int y)
   {
     return x + y;
   } //定义函数
   struct Node
   {
   }; //定义类型
} //注意这里没有分号 ! !
 
命名空间里可以定义变量,函数,类型
// test.cpp
namespace N1
{
int a;
int b;
int Add(int left, int right)
 {
     return left + right;
 }
namespace N2
 {
     int c;
     int d;
     int Sub(int left, int right)
     {
         return left - right;
     }
 }
}
 
命名空间也可以嵌套命名空间,有什么使用场景呢?
namespace bit
{
	namespace f
	{
		void Add(int x, int y)
		{
			cout << 2*x + y << endl;
		}
	}
}
namespace f
{
	int x;
	void Add(int x, int y)
	{
		cout << x + y << endl;
	}
	struct Node
	{
	};
}
int main()
{
	bit::f::Add(1, 2);
	f::Add(1, 2);
	return 0;
}
 
如上代码 当你想用两个同名命名空间里的东西时,就可以嵌套命名空间。
//test.h
#include<iostream>
using namespace std;
namespace f
{
	void Sub(int x ,int y)
	{
		cout << x - y << endl;
	}
}
//test.cpp
namespace f
{
	int x;
	void Add(int x, int y)
	{
		cout << x + y << endl;
	}
	struct Node
	{
	};
}
#include"test.h"
int main()
{
	bit::f::Add(1, 2);
	f::Add(1, 2);
	f::Sub(1, 2);
	return 0;
}
 
输出结果:3 -1 可以正常编译
我们可以发现:同一个工程中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中。
👿 命名空间的使用
📒 加命名空间名称及作用域限定符
:: 是C++中的作用域限定符,左边没东西默认访问全局
namespace f
{
	int x = 2;;
	void Add(int x, int y)
	{
		cout << x + y << endl;
	}
	struct Node
	{
	};
}
int x = 0;
int main()
{
	cout << ::x << endl;//使用全局的
	bit::f::Add(1, 2); //使用嵌套命名空间的函数
	cout << f::x << endl;//使用命名空间定义的变量
	f::Add(1, 2); //使用命名空间定义的函数
	struct f::Node pnode;//使用命名空间定义的类型
	return 0;
}
 
📒 展开命名空间
命名空间的本质是定义一个命名空间域,展开命名空间实际是增加编译器查找的顺序,除了在局部域和全局域找还在命名空间域找,它实际是一个声明,声明你可以访问这块空间
using namespce N;
int main()
{
    printf("%d\n", N::a);
    printf("%d\n", b);
    Add(10, 20);
    return 0;    
}
 
对于代码中的b,由于展开了命名空间,先在局部域找,没找到再在全局域,最后在再在命名空间域里找
namespace f1
{
 int val = 0;
}
namespace f2
{
  int val = 1;
}
using namespace f1;
using namespace f2;
cout << val << endl;
 
代码不能正常编译
注意:展开多个命名空间时,空间里有同名的会起冲突,所以尽量不要随意展开!!
📒 指定展开空间的某一个
namespace N
{
int b = 0;
}
using N::b;
int main()
{
    printf("%d\n", b);
    return 0;    
}
 
如果我们要解决上面的问题可不可以代码是这样的?
namespace N
{
int rand = 0;
}
using N::rand;
int main()
{
    printf("%d\n", b);
    return 0;    
}
 
在这里编译器会报错,原因是展开指定中的某一个实际是一个声明,声明你可以访问这块命名空间里的rand,但是会与全局域的rand函数冲突,编译器不知道到底要用哪个rand
printf("%d\n", N::b);
 
这种写法明确告诉你要访问的是N这个命名空间里的rand
注意:命名空间域并不会改变生命周期
三 🏠 C++输入与输出
我们的C++祖师爷对C语言的输入和输出函数感到不足,所也设计了新的输入和输出函数
👿 cout和cin
std是C++标准库的命名空间名,C++将标准库的定义实现都放到这个命名空间中
#include<iostream>
using namespace std;
 int a;
   double b;
   char c;
   // 可以自动识别变量的类型
   cin>>a;
   cin>>b>>c;
   cout << a << "" << b <<endl<<'\n'
   //换行可以使用endl或‘\n’
 
注意:
- <<是流插入运算符,>>是流提取运算符
 - cin 和 cout 可以自动识别类型
 - cout和cin是全局的流对象,endl是特殊的C++符号,表示换行输出,他们都包含在包含< iostream >头文件中。
 - 使用cout标准输出对象(控制台)和cin标准输入对象(键盘)时,必须包含< iostream >头文件以及按命名空间使用方法使用std。
 
使用cout
//1.
using nampspace std;
//2.
std::cout
//3.
using std:: cout;
using std::endl;
 
关于std命名空间
我们前面说了最好不要随意展开命名空间,这是必须的吗?
- 在日常练习中,建议直接using namespace std即可,这样就很方便
 - using namespace std展开,标准库就全部暴露出来了,如果我们定义跟库重名的类型/对象/函数,就存在冲突问题。该问题在日常练习中很少出现,但是项目开发中代码较多、规模大,就很容易出现。所以建议在项目开发中使用.
 
四 🏠 缺省参数
👿 缺省参数的概念
缺省参数是声明或定义函数时为函数的参数指定一个缺省值。
void Func(int a = 0)
{
 cout<<a<<endl;
}
int main()
{
 Func();     // 没有传参时,使用参数的默认值
 Func(10);   // 传参时,使用指定的实参
return 0;
}
 
输出:
0
10
如果没有指定实参则采用该形参的缺省值,否则使用指定的实参
👿 缺省参数的分类
- 全缺省参数
指的是给每个形参一个默认值 
void Func(int a = 10, int b = 20, int c = 30)
 {
     cout<<"a = "<<a<<endl;
     cout<<"b = "<<b<<endl;
     cout<<"c = "<<c<<endl;
 }
 Func(1,2,3); //输出1 2 3
 Func(1,2);//1 2 30
 Func(1);//1 20 30
 //不能是Func(1,,3);
 
- 半缺省参数
指的是给一部分缺省参数 
void Func(int a, int b = 10, int c = 20)
 {
     cout<<"a = "<<a<<endl;
     cout<<"b = "<<b<<endl;
     cout<<"c = "<<c<<endl;
 }
 //不能在函数和声明同时缺省
  //a.h
  void Func(int a = 10);
  
  // a.cpp
  void Func(int a = 20)
 {}
 
注意:
- 半缺省参数必须从右往左依次来给出,不能间隔着给
 - 缺省参数不能在函数声明和定义中同时出现(如果生命与定义位置同时出现,恰巧两个位置提供的值不同,那编译器就无法确定到底该用那个缺省值)
 - 缺省值必须是常量或者全局变量
 - C语言不支持
 
应用场景:比如我们给链表扩容时如果知道要扩多少直接给形参,不知道就用缺省参数作为指导扩容值.
看完不妨给个一键三连呀 ~
关注小庄 顿顿解馋(ᕑᗢᓫ∗)˒


















