一、c++的发展:
语言的发展是一个逐步递进的过程,C++是在C语言的基础上发展起来的。
1、起因: 1979年,本贾尼等人试图分析unix内核的时候,由于没有合适的工具能够有效的分析由于内核分布而造成的网络流量以及该怎样将内核模块化,本贾尼博士完成了一个可以运行的预处理程序,称之为CPre,只是在C语言基础上增加了类似Simula的类机制,此时的C++称之为C withclass,只是对C的扩展。在该过程中,本贾尼博士思考是否要开发一款新语言,当时贝尔实验室对该想法非常感兴趣,让本贾尼博士等人组成一个开发小组,专门进行研究。
2、问题:C++要在运行时间、代码紧凑性和数据紧凑性方面要能够与C语言进行媲美,还要尽量避免语言应用领域的限制。实现&参考:最简单的做法就是让C++从C语言继承过来
3、发展阶段:
“C with Class”阶段:研究者在C语言基础上加进去的特征有:类及派生类、公有和私有成员的区分、类的构造函数和析构函数、友元、内联函数、赋值运算符的重载等
C++1.0版:添加虚函数概念、函数和运算符的重载、引用、常量等
C++2.0版:更加完善的支持面向对象程序设计的C++语言,新增加类的保护成员、多重继承、对象的初始化与赋值的递归机制、抽象类、静态成员函数、const成员函数等
C++3.0版:对C++进一步完善,引入了模板template,解决了多重继承产生的二义性问题和相应的构造函数和析构函数的处理C++98:C++标准得到了国际标准化组织(ISO)和美国标准化协会(ANSI)的批准,标准C++语言及其标准库更体现了C++的设计初衷。名字空间的概念、标准模板库(STL)中增加标准容器、通用算法和字符串类型等使C++语言更为实用
2003年C++标准第二个版本对第一个版本进行了整理—–修订错误、减少多异性等,但没有改变语言特性
2005年,C++标准委员会发布了一份技术报告(TechnicalReport,TR1)详细说明了计划引入C++的新特性。这个新标准被非正式地命名为C++0x,因为其预计会在本世纪第一个十年的某个时间发布。讽刺的是,直到2011年年中该标准才面世,相应的技术文档也随之出炉,一些编译器厂商也开始试验性地支持这些新特性
C++11:2011年中,新的C++标准(C++11)面世。boost库对该版本影响很大,一些新的模块甚至直接衍生于boost中相应的模块。一些新的语言特性,包括正则表达式、完备的随机数生成函数库、新的时间相关函数,原子操作支持、标准线程库(2011之前,C和C++语言均缺少对线程的支持)、一种能够和某些语言中foreach语句达到相同效果的新的for语法、auto关键字、新的容器类、更好的union支持、数组初始化列表的支持以及变参模板的支持等等
C++17
C++20:已经在制定ing…
二、C语言与c++的不同:
1、c与c++表面上看是两个工程不一样,实际上是背后所用的编译器不一样。C语言用的C语言的编译器,c++用的是c++自己的编译器。表面上是编译器不一样,实际上是语法不一样,编译器是根据语法来写的。它们又属于两个语言,所以语法肯定不同。
2、函数上的区别:c++中的函数没有返回值的情况下,是不能调用的,而在C语言中返回值默认为整形
3、缺省参数:缺省参数是声明或定义函数时为函数的参数指定一个默认值。在调用该函数时,如果没有指定实参则采用该默认值,否则使用指定的实参。
在C语言中函数参数省略,默认为调用时,可以传递任意多个参数,也可以不传递参数。但是在c++中则不行:若是函数不带参数,则调用时也不能传参。
分类:
(1)全缺省:每个参数都给定一个缺省值,调用的时候可以都传,也可以只传一部分,也可以不传。
全缺省类型的参数,若是只传了一部分,这一部分的参数,从左到右传值,缺省的部分用缺省值。
void test(int a = 11,int b=33,int c=66)
{
printf("a=%d ", a);
printf("b=%d ", b);
printf("c=%d ", c);
printf("\n");
}
int main()
{
test();
test(10);
test(10, 20);
test(10, 20, 30);
return 0;
}
![](https://i-blog.csdnimg.cn/blog_migrate/629642402b8d1c1f85bc5e01151f5158.png)
2、半缺省:给函数的一部分参数给定缺省值。给缺省参数的时候,从右往左给依次给定。可以不给左边,给定右边,但是不能给定左边的,不给定右边的。没有给定缺省值的函数,在传参是必须给定参数。(传值的时候从左往右,给缺省值的时候从右往左)
void test(int a ,int b=33,int c=66)
{
printf("a=%d ", a);
printf("b=%d ", b);
printf("c=%d ", c);
printf("\n");
}
int main()
{
//test();在这个半缺省关系中会出错,因为a没有给定缺省值
test(10);//c和b的缺省值存在,则把参数给a(从右往左查看)
test(10, 20);//c和b的缺省值存在,则把参数10给a,把参数20给b
test(10, 20, 30);
return 0;
}
![](https://i-blog.csdnimg.cn/blog_migrate/1140194cc2c720f73222632155af01e1.png)
注意:
(1)带缺省值的参数必须放在参数列表的最后面
(2)缺省参数不能同时在函数声明和定义中出现,只能二者则其一(若声明和定义中都给值,且值不同,那么使用哪个值,会产生冲突;建议将值给在声明的位置,将声明放在头文件中,可以将源文件封装在动、静态库,而不用将源文件透漏给别人,此时,若将缺省值封装在源文件里,则不能让使用者知道到底是否存在缺省值。)
(3)缺省值必须是常量或者全局变量
(4)C语言不支持
4、C语言与c++对函数名的处理规则不一样:C语言在函数名字前面加下划线,若函数名字相同会产生重复定义的错误。
而在c++中为:?函数名@@YA返回值类型参数类型@Z。则返回值类型相同,只要函数参数不同就不会产生错误。
所以c++写的函数,直接拿到c语言中去会产生错误,采用方法:extern "C" 返回值类型 函数名(参数)如:
extern "C" int Add(int left, int right)
这条语句加上后,把这个函数当成C语言的风格进行编译。
重载函数:自然语言中,一个词可以有多重含义,人们可以通过上下文来判断该词真实的含义,即该词被重载了。
函数重载是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数、类型、顺序)必须不同,常用来处理实现功能类似数据类型不同的问题。
在同一作用域里面有一系列相同名称,形参列表不同成为函数重载。调用哪一个函数通过实参的类型决定。
int Add(int left, int right)
{
return left + right;
}
double Add(double left, double right)
{
return left + right;
}
long Add(long left, long right)
{
return left + right;
}
int main()
{
Add(30, 40);
Add(30.0, 40.0);
Add(30L, 40L);
return 0;
}
注意:(1)一个函数的参数全部是字符型,另一个函数的参数全部是整形,在传参的时候,若是一个参数给整形、另一个参数给字符型,编译器会报错,因为不确定是把整形的参数转换为字符型进行计算,还是把字符型的参数转换为整形进行计算。此时可以强制类型转换。(2)若是只定义整形参数的函数,调用函数时传的参数为字符型的,则可以通过编译,将字符型参数转换成了整型。(3)仅仅返回值类型不同,而参数相同,则不能构成重载函数。重载函数与返回值没有直接关系。
1、extern和static的总结:
2、 C语言中为什么不能支持函数重载?
3、 C++中函数重载底层是怎么处理的?
4、C++中能否将一个函数按照C的风格来编译?