“你总以为机会无限,所以不珍惜眼前人”
前言
提到C++,大部分人都想到的是复杂的语法和大量的规则,相对于java和python等语言,需要程序员的要求更高,但C++的优势也是显而易见的,效率高、对细节的控制能力强,应用更广、性能更优等等,这篇文章,我们就从C语言开始,讨论C++的基础语法。
命名空间
C++这门语言被发明出来,其实就是为了解决C语言的缺陷与不足。在C语言中,有个很大的问题就是变量的命名冲突
问题。其中包括与自己定义的变量与库中定义变量之间的命名冲突问题和自己定义的变量之间的命名冲突问题。这个问题在C++中得以很好的解决。
于是在C++中定义了一个命名空间
的概念,命名空间是一种将全局作用域分割为更小、更具体的区域,避免命名冲突的方法。它允许在代码中定义一个区域
,使得其中定义的所有变量、函数、类等名字不会与其他命名空间中定义的名字冲突。命名空间使用关键字namespace
来定义,里面的域作用限定符为:::
下面举例子来演示如何在C++中使用命空间:
// 定义命名空间 namespace zyb { int rand = 0; } int main() { // 使用命名空间中的变量 printf("%d\n",zyb::rand); return 0; }
其中,zyb是自己定义的命名空间的名字,默认情况下,编译器编译代码不会去命名空间限定的区域去找是否有定义的变量和函数、类等等,只有加上 命名空间名::命名空间中的变量名
,才能使用命名空间中限定的变量。
展开命名空间
在使用命名空间的时候,如果经常要使用命名空间中的变量、类等,经常使用限定符指定命名空间就很麻烦。那么,在确定不会出现命名冲突的工程或者自己练习的情况下,可以直接展开命名空间
,展开命名空间后,命名空间里的变量、类等都可以直接使用,不需要再使用限定符来指定命名空间。
展开命名空间格式:
using namespace 命名空间名;
使用C++官方命名空间中的输入输出
相信大家在看C++代码的时候,一定见过这样的代码来表示输入输出:
std::cout << "hello wrld"; std::cin >> a;
其中 << 和 >> 是头文件 < iostream > 中的一部分,分别被称为流插入运算符和流提取运算符。而 cout 和 cin 是C++中的IO流对象,cout 可以将数据输出到控制台或者文件中,cin 可以将控制台或文件中读入数据。这两个 IO 流对象都是定义在< iostream > 中,标准命名空间 std 中的组成部分,加上 std:: 修饰后,编译器就可以找到这个对象并使用。
那为什么看到好多代码中都没有使用 std:: 呢?
既然他们是官方命名空间中定义的,那么就可以在日常练习使用中提前展开它。
using namespace std;
但是在工程项目中尽量不要展开std,易发生命名冲突。
当然,在大项目中,为了方便,也可以使用指定展开
的方式,即只将 std 中的 cout cin 等展开以供使用。
using std::cout; using std::cin;
这样,既避免了全部展开std 全部展开可能出现的命名冲突问题,又方便了书写。
IO流输入输出的使用方法
当展开官方的命名空间后,使用 cout 和 cin 就可以简单的实现输入和输出。
#include <iostream> using namespace std; int main() { int num; cout << "请输入一个整数:" << endl; cin >> num; cout << "您输入的数值是:" << num << endl; return 0; }
endl 是换行的意思,相当于C语言中的 ‘\n’ 。
呢么整个输入输出的规则为:
cout << 变量名或数值
:用于输出变量或数值。
cin >> 变量名
:用于从控制台接收输入,并将值存储到变量中。
缺省参数
缺省参数也是C++相对于C独有的。缺省参数
是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时,如果没有指定实参则采用该形参的缺省值,否则使用指定的实参。
void Func(int a = 0) { cout << a << endl; } int main() { Func(); // 没有传参时,使用参数的默认值 Func(10); // 传参时,使用指定的实参 return 0; }
半缺省
即函数定义中有多个参数,有的参数缺省,有的不缺省。
半缺省参数在使用的时候有一些规则:
- 半缺省参数必须从右往左依次来给出,不能间隔着给
- 缺省参数不能在函数声明和定义中同时出现
半缺省参数如果从右往左给,就不会出现歧义。例如,当传一个参数的时候,如果从右向左开始有半缺省参数,那么最左边的未缺省参数肯定会接收到传进来的参数,这样不会出现到底传给谁
的问题。
函数如果声明和定义分离,缺省参数如果在两个地方都有,则可能会出现两个参数初值不相同的情况。因此C++语法规定:定义时不出现缺省参数,只在声明时给出。
函数重载
函数重载在C++语法中规定:两个函数名可以相同,并且在返回值相同的情况下,参数不同。参数不同包括:参数类型不同、参数个数不同、参数顺序不同等等(不同使用缺省参数实现函数重载,可能会出现歧义的情况)。
C++中函数重载可以实现的原理其实是在编译器链接的过程中,不同参数定义的函数名修饰规则不同。