C++学习笔记
所有运行结果均在VS2022,Debug,x86的环境下得出
一、C++关键字
前面我们学习C语言,其关键字一共有32个关键字,但是,C++的关键字有63个。如下:
二、命名空间
使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染
1.命名空间的定义
定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}中即为命名空间的成员。
1.1命名空间里可以定义函数、变量、类型
代码示例:
#include<stdio.h>
#include<stdlib.h>
namespace zxb
//"zxb"是“邹小白”的缩写
{
int b = 0;
int Add(int left, int right)
{
return left + right;
}
struct Node
{
struct Node* next;
int val;
};
}
1.2命名空间可以嵌套
代码示例:
namespace zxb
//"zxb"是“邹小白”的缩写
{
namespace xb
//"xb"是“小白”的缩写
{
int a = 0;
int Add(int left, int right)
{
return left + right;
}
struct Node
{
struct Node* next;
int val;
};
}
}
1.3多个相同名称的命名空间,编译器最后会合成同一个命名空间中
在同一个文件,或不同文件中,若出现相同名称的命名空间,会进行合并。
可以这样理解:把命名空间看做菜地,隔壁老王他在村子里有多块地,地虽然分布在不同地方,但是这些地,都是老王家的,都合并到老王名下。
如下图所示:
2.命名空间的使用
2.1加命名空间名称及作用域限定符----指定访问
#include<stdio.h>
#include<stdlib.h>
int main()
{
printf("%d\n", zxb::b);
printf("%d\n", zxb::xb::a);
//这里使用的是上面定义的命名空间
return 0;
}
2.2使用using将命名空间中某个成员引入----指定展开某一个
#include<stdio.h>
#include<stdlib.h>
using zxb::b;
int main()
{
//zxb为上面所定义的命名空间
printf("%d\n", zxb::xb::a);
printf("%d\n", b);
return 0;
}
}
2.3使用using namespace 命名空间名称 引入----全展开
#include<stdio.h>
#include<stdlib.h>
using namespce zxb;
//zxb为上面所定义的命名空间
int main()
{
printf("%d\n", b);
Add(10, 20);
return 0;
2.4编译器(VS2022)默认的查找顺序
2.41未展开命名空间
- 当前局部域
- 全局域
会先查找局部域,再去查找全局域
2.42展开了命名空间
- 当前局部域
- 全局域和展开的命名空间
会先查找局部域,若没有查到,会去在全局域和展开的命名空间中所查找
这时候我们需要注意全局和展开命名空间的是否有同名变量。
2.5目前所学的域
- 当前局部域
- 全局域
- 展开的命名空间
- 局部域
- 全局域
- 命名空间域
- 相同点: 不同域可以定义同名的变量/函数/类型
- 不同点:命名空间域修饰全局,不影响生命周期
- 在C++中,一般用花括号“{}”括起来的,都是域。
三、C++的输入与输出
代码示例与讲解:
//头文件
#include <iostream>
//展开命名空间
//std是C++的标准库的命名空间名
//写练习时,常常可以使用它,会更方便
//但是,写项目时,尽量不用,因为容易发生冲突
//此时,常常指定展开某个
using namespace std;
int main()
{
int a;
double b;
char c;
// 可以自动识别变量的类型
//也可以与C语言中的printf与scanf混合使用
//输入流
cin>>a;
cin>>b>>c;
//输出流
cout<<a<<endl;
cout<<b<<" "<<c<<endl;
return 0;
}
四、缺省参数
1.概念
缺省参数是声明或定义函数时为函数的参数指定一个缺省值。
- 缺省参数不能在函数声明和定义中同时出现
- 缺省值必须是常量或者全局变量
- C语言不支持(编译器不支持)
以下代码便使用了缺省参数
void Func(int a = 0)
{
cout<<a<<endl;
}
int main()
{
Func(); // 没有传参时,使用参数的默认值
Func(10); // 传参时,使用指定的实参
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;
}
void Func(int a, int b = 10, int c = 20)
{
cout<<"a = "<<a<<endl;
cout<<"b = "<<b<<endl;
cout<<"c = "<<c<<endl;
}
2.分类
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;
}
2.2半缺省参数
void Func(int a, int b = 10, int c = 20)
{
cout<<"a = "<<a<<endl;
cout<<"b = "<<b<<endl;
cout<<"c = "<<c<<endl;
}
- 半缺省参数只能从右往左依次给出,不能间隔跳跃着给。