一、 C++关键字
c++的关键字要比c语言要多31个足足有63个,这里我只是了解了下每个有啥作用,具体使用方法以及更多的知识将在后续学习中,慢慢扩展使用,下方表格就是c++的63个关键字
asm | do | if | return | try | auto |
double | inline | typedef | dynamic_cast | int | typeid |
public | break | else | long | sizeof | typename |
throw | case | enum | mutable | static | wchar_t |
catch | explicit | namespace | static_cast | unsigned | default |
char | export | new | struct | friend | class |
extern | operator | switch | register | const | false |
private | template | true | const_cast | protected | this |
while | delete | goto | reinterpret_cast | short | for |
bool | signed | union | using | float | volatile |
void | virtual | continue |
二、命名空间
在刚学习c语言的时候,我遇到过定义了重复的变量名或者函数名,那时候喜欢都定义成a、b这些经常出现重定义,要不就是和库函数相同了,但是在c++中,提出了命名空间这个概念,他的大概意思就是把一块函数或者变量封存在一起,例如下方代码演示,就会出现如图所示的错误,这是就可以使用命名空间。
#include <iostream>
using namespace std;
int a = 0;int a = 1;
int main()
{
cout << a << endl;
return 0;
}
如下图就是命名空间的最简单使用,说白了就是相当于重新建立了一个范围,并且把这块空间的变量啊函数啊等等的都包含在这里面,相当于一个库函数,但是不通过:: 这个符号的访问会找不到,这个符号前面就是需要寻找的空间名,也就是namespace命名的空间,如代码中LY1就是一个命名,这个命名可以自定义,我比较喜欢用我的名字缩写,所以之后的命名空间不出意外应该都是这样类型的。
#include <iostream>
using namespace std;
namespace Ly1
{
int a = 0;
}namespace Ly2
{
int a = 1;
}int main()
{
cout << Ly1::a << endl;
cout << Ly2::a << endl;
return 0;
}
好了上文讲了为啥会有命名空间,那么接下来将讲下命名空间的三种用法
1、加命名空间名称及作用域限定符
如上文中代码 cout << Ly1::a << endl;cout << Ly2::a << endl;这两句就是访问LY1和LY2进行打印输出两个空间a的数值就是加加命名空间名称及作用域限定符的使用方法,就不过多讲了,一般会用就可以。
2、使用using进行全部展开
如上文代码using namespace std;这个就是全部展开,这样我在下面使用cout和endl时就不需要再加上作用域限定符。
3、使用using部分展开
这个就如下代码和测试结果就是部分展开的使用,展开了所以a在使用中就不需要加上作用域限定符了,而b加上了,c没加上所以就报错了,没有找到c,为什们会有全展开和部分展开,因为在使用过程中,如果每一步都加上作用域限定符会显得很麻烦,所以在确定某个函数或者变量经常使用又不会出现重复时就可以进行部分展开或者全部展开方便进行使用。
namespace Ly1
{
int a = 0;
int b = 1;
int c = 2;
}
using Ly1::a;
int main()
{
cout << a << endl;
cout << Ly1::b << endl;
cout << c << endl;
return 0;
}
命名空间是可以进行嵌套的,如下方代码 和测试结果就是找不到b变量,那是因为在Ly1这个空间里是Ly2并不是b所以要想a变量那要嵌套访问才能找到。
namespace Ly1
{
namespace Ly2
{
int a = 0;
int b = 1;
int c = 2;
}
}
int main()
{
cout << Ly1::Ly2::a << endl;
cout << Ly1::b << endl;
return 0;
}
三、 C++输入&输出
输入和输出这是每个编程语言都会有的,例如c语言的scanf和printf,c++的就是cout和cin,他就是控制台输出和控制台输入,是一种流输入输出,就像c语言的文件管理时,要先调用file,想要使用文件就先要打开流一样,这里c++的输入与输出是可以自动识别类型的,这点就比c语言要人性一点,代码使用与测试结果如下,如图就是这个输入输出的使用,endl就是换行,值得一提是,他的流入与流出就是>><<这两个,这个在c语言中是位移操作,这里是向左就是流入,向右就是流出。
int main()
{
int a = 1;
double b = 2.22;
cout << a << endl;
cout << b << endl;
cin >> a;
cin >> b;
cout << a << endl;
cout << b << endl;
return 0;
}
四、 缺省参数
缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时,如果没有指定实参则采用该形参的缺省值,否则使用指定的实参,这个最能体现的就是当时我学数据结构时,有个单链表用数组组成的,当时有个容量,我是在初始化就开辟了一点空间,但是只有4个字节,如果我想要存入100个int型的数据就要先开辟,那么这个缺省参数就可以很好的解决这个问题,因为当我知道有100个需要存储的数据,就可以直接给定100,直接开辟,省了很多消耗,下面我将讲下缺省参数的几种使用方式以及注意事项。
第一种就是如图这样不给函数参数就直接使用函数的形参
第二种就是给定参数,这时函数就使用实参的值,如图所示
接着就是第三种再有很多个形参时,是怎么使用,如图就是当有三个参数时,怎么使用,他还是有参数传递过来时使用实参的值,没有还是使用形参,但是这里要注意必须从右到左省略,不能传了a和c不传b,也不能传传后面不传a的,具体为啥,我也不知道,这就是c++规定的,而且还不能同时定义形参的值,就是不能在函数里定义了缺省参数,却又在声明时有定义一遍,c++也规定了只能在声明中定义,也就是当有声明时 ,只能在定义中声明,不能在函数中定义。
五、 函数重载
函数重载这个也是个很方便的,在c语言中如果有两个同样函数名的函数时也会报错,他在编译时会找不到使用那个函数,但是c++不一样,假如我定义两个ADD函数,一个加整数,一个加小数,就可以这样使用,代码与测试结果如图,就可以同时使用,这里就可以看出c++支持函数重名。
int ADD(int a, int b)
{
return a + b;
}double ADD(double a, double b)
{
return a + b;
}int main()
{
int a = 1, b = 2;
double c = 1.1, d = 2.2;
cout << ADD(a, b) << endl;
cout << ADD(c, d) << endl;
return 0;
}
但是这个使用也是有限制:
1、参数类型不同
参数类型不同这个很好理解就如上文代码就是参数类型不用,int和double就是不同的类型。
2、参数个数不同
参数个数不同这个如下代码,一个两个一个三个就是参数类型不同,当然具体几个没有要求
int ADD(int a, int b)
{
return a + b;
}int ADD(int a, int b,int c)
{
return a + b+c;
}int main()
{
int a = 1, b = 2,c=3;
cout << ADD(a, b) << endl;
cout << ADD(a,b,c) << endl;
return 0;
}
3、参数类型顺序不同
参数顺序不同就是怎么说呢,直接上代码,这种就是参数类型不同,第一个就是double在前,第二个就是double在后,这种也是可以使用函数重载。
void Print(double a, int b)
{
cout <<a << endl;
cout << b << endl;
}void Print(int a, double b)
{
cout << a << endl;
cout << b << endl;
}int main()
{
Print(6.66, 6);
Print(6, 6.66);
return 0;
}
还有一点就是函数重载他是在编译的时候找到对应函数的地址如下图汇编代码,两个call就是对应函数的地址。
这个函数在编译的时候是把函数名称提换成别的名字,如下图就是在Windows环线中编译报错提示找不到这个函数,也就是这个函数替换后的名字,具体怎么命名的我也不太清楚,Linux后期学了,会放Linux的命名规则图的。