前言
终于进入到了C++的学习了,让我们先简单了解一下什么是C++吧。
C++是一种面向对象的语言,
是1982年,Bjarne Stroustrup博士在C语言的基础上引入并扩充了面向对象的概念,
所发明的一种新的程序语言。所以呢,C++是基于C语言而产生的。
C++经过这么多年的发展,已经衍生出许多的历史版本,
我们主要学习的就是C++98和C++11这两个版本。
好了,关于C++的发展历史大概说到这里,下面开始真正开始C++学习之旅吧,希望每一位学习C++语言的同学都能一起进步,加油吧!
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++就产生了namespace这个关键字,也就是命名空间,用来作隔离。
那命名空间怎么使用呢?请看下面的代码
namespace wyc //wyc为命名空间的名称
{
//在这里写命名空间的内容,可以定义变量、函数等
int a;
void swap(int* px,int* py)
{
int tmp = *px;
*px = *py;
*py = tmp;
}
//...
}
不仅如此,命名空间还可以嵌套,也就是说,在一个命名空间里可以定义另一个命名空间
//命名空间的嵌套
namespace wyc //wyc为命名空间的名称
{
//在这里写命名空间的内容,可以定义变量、函数等
int a;
void swap(int* px, int* py)
{
int tmp = *px;
*px = *py;
*py = tmp;
}
namespace NEXT
{
int b;
int c;
int Add(int x, int y)
{
return x + y;
}
}
//...
}
在同一个工程的不同文件中,可以存在相同名称的命名空间,
最后编译的时候编译器会把它们合成到同一个命名空间中去。
这很好理解,我就不写出代码了。
我们需要注意的是:
每一个命名空间都定义了一个新的作用域,命名空间中的所有内容都被限定在该命名空间中,
所以这就能产生隔离的效果,有效避免了命名冲突和污染。
现在我们知道了命名空间如何定义,那么这么使用它里面的成员呢?
命名空间的使用有三种方式
//方式1:加命名空间名称及作用域限定符(::)
int main()
{
//现在我想调用swap函数
int x = 10, y = 20;
wyc::swap(&x, &y);
printf("x=%d y=%d\n", x, y);
return 0;
}
//方式2:使用using将命名空间中成员引入
using wyc::swap;
int main()
{
//现在我想调用swap函数
int x = 10, y = 20;
swap(&x, &y);
printf("x=%d y=%d\n", x, y);
return 0;
}
//方式3:使用using namespace + 命名空间名称引入
using namespace wyc;
int main()
{
//现在我想调用swap函数
int x = 10, y = 20;
swap(&x, &y);
printf("x=%d y=%d\n", x, y);
return 0;
}
需要注意的是:
方式3相当于把命名空间全部展开了,
这时候命名空间中的内容就相当于是全局的变量,命名空间也失去了隔离的作用,
我们在平时练习代码的时候可以使用方式3展开命名空间,但是在做项目的时候要慎用这种方法。
比如,我们都知道,一个C++的程序,开头的代码一般是以下两句
#include <iostream>
using namespace std;
std是C++的一个库,也是封装在命名空间里,这样展开是为了方便我们使用,
否则我们每次使用C++的输入输出,即cout和cin时,每次都要在前面加上作用域限定符,比较麻烦。
缺省参数
缺省参数是声明或定义函数时,为函数的参数指定一个默认的值,
所以有时也叫默认参数,在调用该函数时,如果没有指定实参,则使用默认的值,如果指定,就使用指定的实参。
//缺省参数
void Print(int x = 10)
{
cout << x << endl;
}
int main()
{
Print();//不传参,使用默认值
Print(20);//传参,使用实参
return 0;
}
缺省参数又可以分成全缺省参数和半缺省参数。
全缺省参数是指函数参数全部都有默认值
//全缺省参数
void Print(int x = 10,int y = 20,int z = 30)
{
cout << x << endl;
cout << y << endl;
cout << z << endl;
}
int main()
{
//几种调用的方式
Print();
Print(1);
Print(1, 2);
Print(1, 2, 3);
return 0;
}
半缺省参数不是说缺省一半的参数,而是部分缺省
//半缺省
void Print(int x, int y, int z = 30)
{
cout << x << endl;
cout << y << endl;
cout << z << endl;
}
int main()
{
//几种调用的方式
Print(1, 2);
Print(1, 2, 3);
return 0;
}
//这种缺省是错误的
void Print(int x, int y = 20, int z)
{
cout << x << endl;
cout << y << endl;
cout << z << endl;
}
注意:
1)半缺省参数必须从右往左,连续缺省,不能间隔缺省
2)缺省参数不可以同时在函数的声明和定义中同时出现,
否则如果正好两边给的默认值不同,编译器就不知道用哪个值了。
3)缺省值也就是给定的默认值必须是常量或者全局的变量
4)C语言不支持缺省参数