关注小庄 顿顿解馋(ᕑᗢᓫ∗)˒
引言:本篇博客我们开始与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.cppnamespace 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.cppnamespace 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语言不支持
应用场景:比如我们给链表扩容时如果知道要扩多少直接给形参,不知道就用缺省参数作为指导扩容值.
看完不妨给个一键三连呀 ~