前言
C++是在C的基础之上,容纳进去了面向对象编程思想,并增加了许多有用的库,以及编程范式
等。熟悉C语言之后,对C++学习有一定的帮助。
c++补充了C语言语法的不足,以及C++是如何对C语言设计不合理的地方进行优化的。
一、c++关键字
c++一共有63个关键字,C语言32个关键字,也就是说c++在C语言的基础上多了一倍的关键字
asm | do | if | return | try | continue |
auto | 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 |
二、命名空间
命名空间是为了防止自己的命名与c/c++库中的名称相同而不能使用,有了命名空间后,以前不能在c语言中使用的名称可以在命名空间中使用,要访问只需要在前面加上域作用限定符即可。当然,关键字是不能使用的即使在命名空间也不行
rand以前是随机数的函数,现在被我们定义成了int变量,所以报错人的重定义。想要解决这样的问题就需要命名空间。
从图中我们可以发现,除了关键字不能使用像库中的函数名等都可以在命名空间使用。
当然命名空间也支持嵌套:
如上图所示, 对于要访问命名空间中的命名空间只需要加入合适的域名限定符即可。
在同一个工程中允许存在多个相同名称的命名空间,编译器最后会把他们合成到一个命名空间中。
一个命名空间就定义了一个新的作用域,命名空间中的所有内容都局限于该命名空间中。
当然命名空间不仅仅有上图中一种使用方式,下面是三种方法的对比:
加命名空间名称及作用域限定符。
这就是我们使用的那个方法。
使用using将命名空间中某个成员引入。
使用using namespace命名空间名称引用
三:c++输入和输出
std是c++标准库的命名空间名,c++将标准库的定义实现都放在这个命名空间中。
1.使用cout标准输出对象(控制台)和cin标准输入对象(键盘)时,必须包含<iostream>头文件以及按命名空间使用方法使用std;
2.cout和cin是全局的流对象,endl是特殊的c++符号,表示换行输出,他们都包含在<iostream>头文件中。
3.<< 是流插入运算符, >> 是流提取运算符。
4.使用c++输入输出更方便,不需要像printf/scanf输入输出时那样,需要手动控制格式。c++的输入输出可以自动识别变量类型。
四:缺省参数
缺省参数就是声明或定义函数时为函数的参数指定一个缺省值,如果你在调用这个函数的时候没有传参数,那么这个函数的参数的值就是缺省值,如果你在调用这个函数的时候传了参数,那么这个函数的参数的值就是你所传参数的值。
缺省又分为全缺省和半缺省,全缺省的意思就是函数的每个参数都给了缺省值,半缺省的意思就是函数的参数只给了个别的缺省值。
1.半缺省参数必须从右往左依次来给出不能间隔着给,比如上图49行代码应该从z开始依次向左给出。
2.缺省参数不能在函数声明和定义中同时出现。
3.缺省值必须是常量或者全局变量。
五:函数重载
函数重载是函数的一种特殊情况,c++允许在同一个作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数,类型,类型顺序)不同,常用来处理实现功能类似数据类型不同的问题。
第一种: 参数类型不同
void test(int x, int y) { cout << "test(int x,int y)" << endl; } void test(double x, double y) { cout << "test(double x,double y)" << endl; } int main() { int a = 10, b = 20; double x = 1.22, y = 3.22; test(a, b); test(x, y); return 0; }
第二种:参数个数不同
void test(int x) { cout << "test(int x)" << endl; } void test() { cout << "test()" << endl; } int main() { int a = 10; test(a); test(); return 0; }
第三种:参数类型顺序不同
void test(int x, char y) { cout << "test(int x,char y)" << endl; } void test(char y, int x) { cout << "test(char y,int x)" << endl; } int main() { int a = 10; char c = 'a'; test(a,c); test(c,a); return 0; }
以上就是函数重载的演示,不知道大家有没有想过为什么函数返回值不能做函数重载呢?
因为如果返回值可以重载的话那么你在调用函数传参的时候该怎么区分呢?如下图
两个函数都传一个int类型的参数编译器根本无法区分到底调用哪个。
由于windows下函数重载命名的方式太过复杂,我们在linux环境下看g++编译完成后函数名字的修饰是如何改变的。
我们可以发现testii和testdd就是test的两个函数,编译器通过函数参数不同去命名不同的函数。