目录
什么是C++
C语言是结构化和模块化的语言,适合处理较小规模的程序。对于复杂的问题,规模较大的程序,需要高度的抽象和建模时,C语言则不合适。为了解决软件危机, 20世纪80年代, 计算机界提出了OOP(object oriented programming:面向对象)思想,支持面向对象的程序设计语言应运而生。
1982年,Bjarne Stroustrup博士在C语言的基础上引入并扩充了面向对象的概念,发明了一种新的程序语言。为了表达该语言与C语言的渊源关系,命名为C++。因此:C++是基于C语言而产生的,它既可以进行C语言的过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的程序设计,还可以进行面向对象的程序设计。
总而言之,是Bjarne Stroustrup博士在使用C语言的时候,发现C语言有许多不足,然后大佬在这基础上创造了我们现在需要学习的语言,C++。
命名空间
在C/C++中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染,namespace关键字的出现就是针对这种问题的。
命名空间的定义
定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}中即为命名空间的成员。
其实我们不难发现,有一点点像我们在C语言阶段学习的结构体。那么命名空间的代码实现又是什么样的呢,如下所示:
普通的命名空间
//1. 普通的命名空间
namespace MWB // MWB为命名空间的名称
{
// 命名空间中的内容,既可以定义变量,也可以定义函数
int a;
int Add(int x, int y)
{
return x + y;
}
}
命名空间的嵌套
namespace MWB1
{
int a;
int b;
int Add(int x, int y)
{
return x + y;
}
namespace MWB2
{
int c;
int d;
int Sub(int x, int y)
{
return x - y;
}
}
}
命名空间的合并
若在同一个工程中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中。
//3. 同一个工程中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中。
namespace MWB1
{
int Mul(int x, int y)
{
return x * y;
}
}
注意:命名空间就相当于定义了一个新的作用域,出作用域后里面的内容将不可用。
输入与输出
前言
我们首先用C++来跟世界打个招呼,代码如下:
#include<iostream>
using namespace std;
void Add()
{
cout << "hello world !" << endl;
}
int main()
{
Add();
return 0;
}
由此可见C++的输入方式和C语言有本质的区别。
代码解析
C++的输入完全不同与C语言,C++是利用标准输入“cin”来进行输入操作的,“cout”来进行标准输出操作的,并且使用的时候必须包含<iostream>头文件以及std标准命名空间。那么C++的输入与输出相较于C语言有哪些优势呢,首先,我们在用C语言进行输入输出操作的时候不同的类型需要不同的格式控制符,但是C++就不需要。
缺省参数
缺省参数是声明或定义函数时为函数的参数指定一个默认值。在调用该函数时,如果没有指定实参则采用该默认值,否则使用指定的实参。
缺省参数的分类
全缺省参数
是指每个参数在形参中都有赋值。
void TestFunc(int a = 1, int b = 2, int c = 3)
{
cout << "a=" << a << endl;
cout << "b=" << b << endl;
cout << "c=" << c << endl;
}
半缺省参数
void TestFunc(int a, int b = 2, int c = 3)
{
cout << "a=" << a << endl;
cout << "b=" << b << endl;
cout << "c=" << c << endl;
}
注意
1、 半缺省参数必须从右往左依次来给出,不能间隔着给
比如:
2、缺省参数不能在函数声明和定义中同时出现
3、缺省值必须是常量或者全局变量
4、C语言不支持(编译器不支持)
函数重载
自然语言中,一个词可以有多重含义,人们可以通过上下文来判断该词真实的含义,即该词被重载了。
比如:以前有一个笑话,国有两个体育项目大家根本不用看,也不用担心。一个是乒乓球,一个是男足。前者是“谁也赢不了!”,后者是“谁也赢不了!”
函数重载的概念
函数重载:是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数 或 类型 或 顺序)必须不同,常用来处理实现功能类似数据类型不同的问题。
类型不同
int Add(int x, int y)
{
return x + y;
}
double Add(double x, double y)
{
return x + y;
}
参数个数不同
int Add(int x, int y)
{
return x + y;
}
int Add(int x)
{
return x;
}
顺序不同
void Add(double y,int x )
{
cout << "1" << endl;
}
void Add(int x,double y)
{
cout << "2" << endl;
}
注意
只改变函数的返回类型是不构成函数重载的。
用Linux来验证函数重载
先用Linux下创建 func.h func.c test.c
在Linux下编译C++用的是g++编译器,编译C语言用的是gcc编译器。
在C++下对函数名的修饰:
在C语言下对函数名的修饰:
总结
在C语言中,因为链接的时候他们都是直接使用函数名去标识和查找,而重载函数的函数名相同。
然而C++中,有专门的的函数名修饰规则,只要参数不同,重载函数就不存在二义性和冲突了。