1、C++关键字
C++总计有63个关键字,C语言有32个关键字
asm | do | if | return | try | continue |
outo | double | inline | short | typedef | for |
bool | dynamic_cast | int | signed | typeid | public |
break | else | long | sizeof | typename | throw |
case | enum | mutable | static | union | wchar_t |
catch | explicit | namespace | static_cast | unsigned | default |
char | export | new | struct | using | friend |
class | extern | operator | switch | virtual | register |
const | false | private | template | void | true |
const_cast | float | protected | this | volatile | while |
delete | goto | reinterpret_cast |
一些关键字的简要用途介绍
outo | 自动类型推导,根据变量初始化的值自动推导变量的数据类型 |
break | 跳出循环或switch语句 |
case | 在switch语句中用于定义不同的情况 |
char | 定义字符类型变量 |
const | 定义常量,表示变量值不可更改 |
continue | 跳过当前循环,执行下一次循环 |
default | 在switch语句中定义默认情况 |
delete | 释放通过new操作符分配的内存 |
do | 定义一个循环 |
double | 定义双精度浮点数类型变量 |
else | 定义if语句中的else分支 |
enum | 定义枚举类型 |
explicit | 声明构造函数为显式,防止隐式类型转换 |
extern | 声明全局变量函数 |
float | 定义单精度浮点数类型 |
for | 定义一个循环 |
friend | 声明友元函数或友元类 |
goto | 无条件跳转到标签处 |
if | 定义一个条件语句 |
inline | 定义内联函数,使函数直接插入调用点 |
int | 定义整形类型变量 |
long | 定义长整型类型变量 |
mutable | 修饰类中的成员变量,在常量对象中也可以修改 |
namespace | 定义命名空间 |
new | 在堆上分配内存 |
operator | 定义运算符重载函数 |
private | 定义类的私有成员 |
protected | 定义类的受保护成员 |
public | 定义类的公共成员 |
register | 声明寄存器变量 |
return | 从函数中返回值 |
short | 定义短整形类型变量 |
signed | 定义有符号整数类型变量 |
sizeof | 获取对象或类型的字节大小 |
static | 定义静态变量、函数、类成员 |
struct | 定义结构体类型 |
switch | 定义一个多条件选择语句 |
template | 定义模板类或函数 |
this | 指向类的当前对象的指针 |
throw | 抛出异常 |
try | 定义异常处理快 |
typedef | 定义类型的别名 |
typeid | 获取类型信息 |
typename | 声明一个类型参数 |
union | 定义联合类型 |
unsigned | 定义无符号整数类型变量 |
using | 展开命名空间 |
virtual | 声明虚函数,实现多态性 |
void | 定义无返回值的函数或指针 |
volatile | 定义易变变量,表示变量值可能会被意外修改 |
dynamic_cast | 在继承关系中进行安全的类型转换 |
static_cast | 进行静态类型转换 |
2、命名空间
命名空间是一种用于组织和管理代码的机制,它可以避免不同部分的代码之间的名称冲突。命名空间将一组相关的类、函数、变量等封装在一起,使得它们可以通过命名空间来访问。在不同的命名空间中,可以使用相同的名称来表示不同的实体,不会发生冲突。通过使用命名空间,可以提高代码的可读性和可维护性。
变量、函数、类等都是大量存在的,这些变量、函数、类的名称都存在于全局作用域中,可能会导致许多冲突。使用命名空间的目的是对标识符进行本地化,从而避免命名冲突或名字污染。
2.1、命名空间的定义
定义命名空间,需要使用到关键字namespace,后面跟空间的名字,然后接一对{}即可,{}中即为命名空间的成员
//命名空间可以定义函数、变量、类型
namespace BB //BB是命名空间的名字
{
int rand = 0;
int Add(int left, int right)
{
return left + right;
}
struct Node
{
struct Node* next;
};
}
2.2、命名空间的嵌套
命名空间的嵌套帮助将相关的代码更好地组织起来,使得代码结构更加清晰和易于维护。通过将相关的类、函数、变量等放置在同一个命名空间或子命名空间中,可以方便地查找和使用这些代码。
//test.cpp
namespace N1
{
int a = 0;
int b = 0;
int Add(int left, int right)
{
return left + right;
}
namespace N2
{
int c = 0;
int d = 0;
int Sub(int left, int right)
{
return left - right;
}
}
2.3、命名空间的合并
同一工程中允许存在多个相同名称的命名空间,编译器最后会合并为一个命名空间,在编程中,命名空间用于组织和管理代码。一个命名空间中可以包含多个类、函数、变量等。当一个项目中使用了多个命名空间时,有时候需要将这些命名空间中的成员合并到一个命名空间中,以方便在代码中引用和使用。
//test.cpp
namespace N1
{
int a = 0;
int b = 0;
int Add(int left, int right)
{
return left + right;
}
}
//test.h
namespace N1
{
int c = 0;
int b = 0;
int Mul(int left, int right)
{
return left * right;
}
}
在一个工程中的test.h和上面test.cpp这两个N1会被合并为一个
2.4命名空间的使用(展开命名空间)
- 加命名空间名称及作用域限定符::
#include <stdio.h>
namespace BB
{
int a = 1;
int b = 2;
int Add(int left, int right)
{
return left + right;
}
}
int main()
{
printf("%d\n", BB::a);
printf("%d\n", BB::b);
printf("%d\n", BB::Add(2, 3));
return 0;
}
- 使用using将命名空间中某个成员引入
#include <stdio.h>
namespace BB
{
int a = 1;
int b = 2;
int Add(int left, int right)
{
return left + right;
}
}
using BB::a;
using BB::b;
using BB::Add;
int main()
{
printf("%d\n", a);
printf("%d\n", b);
printf("%d\n", Add(2, 3));
return 0;
}
- 使用using namespace 命名空间名称引入
#include <stdio.h>
namespace BB
{
int a = 1;
int b = 2;
int Add(int left, int right)
{
return left + right;
}
}
using namespace BB;
int main()
{
printf("%d\n", a);
printf("%d\n", b);
printf("%d\n", Add(2, 3));
return 0;
}
3、C++的输入和输出
#include <iostream>
//std是C++标准库的命名空间名,C++标准库的定义实现都会放到这个命名空间中
using namespace std;
int main()
{
int a = 10;
cin >> a;
cout << a << endl;
cout << "Hello World!"<< endl;
return 0;
}
- 使用cout标准输出对象和cin 标准输出对象时,必须包含<iostream>头文件,以及展开命名空间std。
- cout和cin是全局的流对象,endl是特殊的C++符号,表示换行输出,她们都包含在头文件<iostream>中。
- >> 是流插入运算符, << 是流提取运算符。
- 使用C++输入输出更加方便,可以自动识别变量类型、连续书写、中间任意添加。
- 实际上cout和cin分别是ostream和istream类型的对象,>> 和 << 也涉及运算重载等方面的知识。
std命名空间的使用惯例
- 在日常练习中,建议直接 using namespace std 即可,这样就很方便。
- using namespace std 展开,标准库函数就全部暴露出来了,如果我们定义跟标准库函数重名的类型、对象、函数时,就存在冲突问题。该问题在日常练习中很少出现,但是在项目开发中代码较多、规模大,就很容易出现这种问题。所以建议在项目开发中使用,像 std::cout 这样使用指定命名空间 + using std::cout 展开常用的对象、类型等。
4、缺省参数
4.1、缺省参数的概念
缺少参数是声明或定义函数时为函数的参数指定一个缺省值。在调用函数时,如果没有指定实参则采用该参数的缺省值,否则使用指定的实参。缺省值指的是在没有明确赋值的情况下,计算机系统默认使用的值。不同编程语言和软件系统有不同的缺省值。
#include <iostream>
using namespace std;
void Func(int a = 0)
{
cout << a << endl;
}
int main()
{
Func(); //没有传参时,使用参数的默认值
Func(10); //传参时,使用指定的参数
return 0;
}
///
0
10
4.2缺省参数的分类
- 全缺省参数
#include <iostream>
using namespace std;
void Func(int a = 10,int b = 100,int c = 1000)
{
cout << "a=" << a << endl;
cout << "b=" << b << endl;
cout << "c=" << c << endl;
}
int main()
{
Func();
Func(1,2,3);
return 0;
}
//
a=10
b=100
c=1000
a=1
b=2
c=3
- 半缺省参数
//缺省一部分,且只能从右向左缺省
#include <iostream>
using namespace std;
void Func(int a , int b = 100, int c = 1000)
{
cout << "a=" << a << endl;
cout << "b=" << b << endl;
cout << "c=" << c << endl;
}
int main()
{
Func(1, 2);
Func(1,2,3);
return 0;
}
/
a=1
b=2
c=1000
a=1
b=2
c=3
注意
- 半缺省参数必须从右往左依次给出来,不能间隔着给。
- 缺省参数不能在函数的声明和定义中同时出现。
- 缺省值必须是常量或者全局变量
- C语言不支持缺省参数(编译器不支持)
void Func(int a = 10)
{
}
void Func(int a = 20)
{
}
//如果声明与定义位置同时出现,恰巧两个位置的值不同
//那么编译器就无法确定到底应该使用那个缺省值
“肤浅的心灵将因为不幸的打击而消沉,伟大的心灵将因此而升华"