C++起源史
C++由美国AT&T贝尔实验室的本贾尼·斯特劳斯特卢普博士在20世纪80年代初期发明并实现(最初这种语言被称作“C with Classes”带类的C)。开始,C++是作为C语言的增强版出现的,从给C语言增加类开始,不断的增加新特性。虚函数(virtual function)、运算符重载(Operator Overloading)、多重继承(Multiple Inheritance)、模板(**Template)常(Exception)、RTTI、命名空间(Name Space)逐渐被加入标准
C++和C语言的关系:
C是C++的子集,C++兼容C的特性。
C++是C语言的继承,进一步扩充和完善了C语言,成为一种面向对象的程序设计语言。C++这个词在中国大陆的程序员圈子中通常被读做“C加加”,而西方的程序员通常读做“C plus plus”,“CPP”。
和C的区别
1、数据类型
在C语言中数据类型主要分为基本类型、构造类型、指针类型、空类型。
基本类型:整型 int、字符型 char、实型(单精度 float、双精度double)
构造类型:数组类型、结构类型 struct、联合类型 union、枚举类型 enum
指针类型
空类型:void
而在C++中 ,除了以上类型之外,另外新增了布尔类型 bool,其值为true或者flase,还引入了类的结构类型。
2、初始化方法
C语言中,变量初始化的方法为复制初始化,如:
int x = 100; //复制初始化
C++中,另外增加一种初始化方法为直接初始化,如:
int x(100); //直接初始化
3、变量的定义
在C语言中,变量的定义要在函数的前面,即当函数中使用到一个新的变量时,要将该变量定义在函数的前面;而在C++中,变量可以随用随定义,如:
for(int i = 0; i < 10; i++) //随用随定义
4、输入输出
C语言中,输入输出方法如下:
int n;
scanf("%d",&n); //利用scanf输入
printf("%d\n, n"); //利用printf输出
C++中,输入输出方法如下:
int n;
cin>>n; //利用cin输入
cout<<n<<endl; //利用cout输出
可以看到,C++中的输入输出不再关心待输入输出的数据类型,更加简单方便。
需要注意的是,在C++中若有输入输出,需添加头文件:
#include<iostream>
另外,需要说明,cin和cout是命名空间std下的函数,即:
using namespace std;
5、命名空间
C++中添加了命名空间这个概念,通俗来讲,命名空间就是为变量和函数创建一个自己的空间,当不同的程序员开发的源代码中使用相同名称的变量和函数时,主函数能够正确地调用自己需要的函数。
#include <iostream> //IO流
#include <stdio.h> //标准输出
using namespace std; //命名空间,隔离名字,防止命名冲突,
//c++所有空间默认std命名空间
namespace my //自定义域my
{
int a=12;
namespace one //自定义my域里面嵌套one域
{
int c=200;
}
}
namespace you //自定义you域
{
int a=1;
}
using namespace you; //将自定义域名变成全局变量
int a=100;//定义全局变量
int main()
{
int a=10; //定义局部变量
printf("局部变量a=%d\n",a);
printf("全局变量a=%d\n",::a);
printf("my域a=%d\n",my::a);
printf("you域a=%d\n",you::a);
printf("my域嵌套c=%d\n",my::one::c);
return 0;
}
运行结果如下
[zyc@localhost lesion1]$ ./a.out
局部变量a=10
全局变量a=100
my域a=12
you域a=1
my域嵌套c=200
总结:
1:当自定义域变成全局变量时且本来已经定义全局变量,访问全局变量时,优先级:
全局变量高于自定义全局变量
2:如果没有指定命名空间,需要在输出时指定变量域
如
#include<iostream>
#include <stdio.h>
//using namespace std;//直接展开
int max=100;
int main()
{
printf("%d\n",max);
printf("%d\n",std::max(1,2));//直接指定输出域
return 0;
}
6:C++自动识别类型(但会发生截断)
#include<iostream>
#include <stdio.h>
using namespace std;
int main()
{
double d=1.11111111;
cout<<"c++环境d="<<d<<endl;
printf("C环境下d=%lf\n",d);
return 0;
}
运行结果
c++环境d=1.11111
C环境下d=1.111111
总结:在C语言中,默认截断位数为6位,在C++中,默认截断5位。并且输出不需要指定类型。
7:C++函数重载(C++特有)
1)函数重载定义:
在同一个作用域中,如果有多个函数的名字相同,但是形参列表不同(参数类型不同或参数个数不同),返回值类型可同也可不同,我们称之为重载函数。
重载的函数是通过形参列表区分的,与返回值类型无关。函数重载其实是”一个名字,多种用法”的思想,不仅函数可以重载,运算符也可以重载。
2)函数重载过程
详细过程见下面这篇博客
https://blog.csdn.net/gogogo_sky/article/details/72807123#0-qzone-1-40789-d020d2d2a4e8d1a374a433f596ad1440
8:缺省参数(备胎)
定义:在函数定义或创建时,给形参一个默认的参数,这样即使在调用函数时即使没有给函数实参,函数就默认刚才设置的形参。
规则:
1)缺省只能 从右往左缺省。
2)缺省值必须为常量或全局变量 (const/static/普通的 全局变量 也可以作为缺省参数)
3)缺省参数只能出现在声明或者定义的一处
4)不能把 const的全局变量 作为缺省值
5)缺省值不构成函数重载,缺省值并没有赋予函数新的功能
如下:
#include<iostream>
using namespace std;
//缺省:全缺省,半缺省(从右往左连续缺省)
int Add(int a=1,int b=2)
{
return a+b;
}
int main()
{
cout<<Add(3,4)<<endl; //有实参,直接使用实参值
cout<<Add(6)<<endl;//半缺省参数,另外一个形参默认b=2
cout<<Add()<<endl;//全缺省参数,默认a=1,b=2
return 0;
}
运行结果:
[zyc@localhost lesion1]$ ./a.out
7
8
3
特别提醒:
(1)凡是出现利用缺省参数值作if判断,并且判断后实现代码完全不同的,都应该分拆成两个独立的函数。