转载至新浪微博(只爱一颗星kkk的博客 )
虽然C与CPP的语法差不多,但是有些地方还是存在一些区别,现在一起来总结一下都有什么区别。
一。带默认值的函数
在C中,我们的函数是这个样子的:
C Code
1 | int Sum(int a, int b) |
但是在C++中,我们的参数可以带默认值:
C++ Code
1 | int Sum(int a, int b) |
1.默认值是从右往左给出的
C++ Code
1 | int Sum(int a, int b,int c);//在这个声明中我们只能从右往左给出默认 |
2。调用参数带默认值的的函数,效率可以提高
调用函数,我们作重要的一步就是压实参。我们拿一段代码来举个例子
C++ Code
1 | #include |
在这段代码中,我们来看Sum(a,b),在调用这个Sum函数时,我们有如下的步骤:
压实参b:
(1)mov eax dword ptr[ebp-8] 取b值放在寄存器
(2)push eax
压实参a:
(1)mov eax dword ptr[ebp-4]
(2)push eax
我们知道,我们取到b的值是要先放在寄存器中的,但是如果这个b给出了默认值,就可以直接把数值放入。
效率提高,也节省了mov的周期。
3.默认值无所谓在那里给,声明定义都可以
4.出现两个声明都给默认值的情况
(1)默认值只能给一次
int sum(int a,int b=20);
int sum(int a,int b=10);错误,因为默认值只能给一次
(2)两个参数都给默认值
int sum(int a,int b=20);
int sum(int a=10,int b);正确,因为代码是从下向上编译的,默认值又是从右往左给出的,所以正确。
int sum(int a=10,int b);
int sum(int a,int b=20);//错误额,违反了从右往左的原则。
二。关于内联函数inline(之后会专门研究此函数)
1.重要知识点和考点
(1)inline int sum(int a ,int b)在一个函数名前加上inline,这个函数只在本函数中可见, (2)它在用时不会产生栈的开辟和回退。
(3)它只在release版本中不会产生栈的开辟和回退,在debug版本中还是会产生。
(4)对于一些调用函数的开销 > 函数执行的开销的时,就用inline,但是要是调用还没有执行的开销大,就不需要使用。
(5)inline 写在头文件中,不写在源文件中。
2.inline与宏
相同处:它们在函数中做一个展开替换的工作。
不同处:inline在编译期间处理,宏在预编译期间处理;inline还会做一个安全检查的工作,但是宏不做。
3.inline与普通函数
相同处:inline也是函数的一种
不同处:inline函数没有标准的栈帧的开辟和回退,但是普通函数不仅有出栈入栈的过程,也会产生符号。
4.inline与static函数
相同处:都是其他文件不可见
不同处:inline函数没有标准的栈帧的开辟和回退,static函数有正常函数栈帧的开辟和回退,而且static函数产生的符号都是local的,在链接中只处理global,不处理local的。
三。关于函数重载(之后具体单独总结)
1.重载的定义
C++ Code
1 |
|
我们来看这段代码,我们可以看出,这是在C++下运行的,因为在c中我们不可能将名字相同的函数写在一个文件中,因为在C中这样会导致函数重定义,但是在C++中却可以。因为在C中,函数的产生的符号是取决于函数名称,在C++中,函数产生符号取决于函数名称+形参类型+形参个数。所以上面的几个函数,在C++中可以运行,我们把这样的函数名相同但是形参列表不同的函数叫做函数重载。
2.静多态与动多态的区别
在C++中,我们区分静多态与动多态
(1)静多态:重载,模板
(2)动多态:继承,虚函数
3.重载时的一些问题
(1)我们不能仅通过返回值不同来进行重载,或者说,与返回值无关,举个栗子
C++ Code
1 | void fun(int a,float b); |
这个也构成了函数重载,因为第一个产生的符号是fun_int_float,第二个是fun_float_int。
(2)重载时,编译器优先看实参的类型,举个栗子
C++ Code
1 | bool compare (int a, int b) int b=4; compare (a, b); |
这样,编译器首先看实参类型为int,所以就选择bool compare (int a, int b)这个函数了。
(3)函数重载时,这些函数必须处于同一作用域中。并且优先考虑局部变量。
(4)函数重载,只用看函数名称,形参列表,形参个数,形参顺序,不用考虑返回值。
四。关于const
1.在C中的const
之前的博客总结了const在C中的用法,但是这里为了比较,就说最主要的区别。
在C中,加了const修饰的仍然是一个变量,只是唯一不可以做左值,我们称作常变量。与普通变量的空间开辟没有任何区别。
2.在C++中的const
(1)在C++中,const必须赋初值
(2)const int a=10;那么,我们的a就是一个常量。在后面的代码中遇到a,就会自动替换为10。
(3)const int a=10; static int a =10;这两个都为其他文件不可见。
(4)我们在const前加extern ,举个栗子,extern const int a=10;这样,符号就会变成global。就可以变为常变量。
(5)const 与引用还有很多用法,之后单独总结。