加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

C与CPP的区别总结(一)

(2017-10-31 22:54:55)
标签:

it

杂谈

分类: C
虽然C与CPP的语法差不多,但是有些地方还是存在一些区别,现在一起来总结一下都有什么区别。
一。带默认值的函数
在C中,我们的函数是这个样子的:
 C Code 
1
2
3
4
int Sum(int a, int b)
{
    return b;
}
但是在C++中,我们的参数可以带默认值:
 C++ Code 
1
2
3
4
int Sum(int a, int b)
{
    return b;
}
1.默认值是从右往左给出的
 C++ Code 
1
2
3
4
int Sum(int a, int b,int c);//在这个声明中我们只能从右往左给出默认 
int Sum(int a, int b, int 10); //ok
int Sum(int a, int 10int c); //error
int Sum(int 10int b, int 10); //error
2。调用参数带默认值的的函数,效率可以提高
  调用函数,我们作重要的一步就是压实参。我们拿一段代码来举个例子
 C++ Code 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include
using namespace std;

int Sum(int a, int 20)
{
    return b;
}

int main()
{
    int 10;
    int 20;
    Sum(a, b);

    return 0;
}
在这段代码中,我们来看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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

bool compare (int a, int b)//compare_int_int
{
    cout << "compare(int ,int)" << endl;
    return b;
}

bool compare (double a, double b) //compare_double_double
{
    cout << "compare(double ,double)" << endl;
    return b;
}

bool compare (float a, float b)//compare_float_float
{
    cout << "compare(float ,float)" << endl;
    return b;
}

bool compare(char *a, char *b) //compare_char_char
{
    cout << "compare(char* ,char*)" << endl;
    return strcmp(a, b) 0 true false;
}
我们来看这段代码,我们可以看出,这是在C++下运行的,因为在c中我们不可能将名字相同的函数写在一个文件中,因为在C中这样会导致函数重定义,但是在C++中却可以。因为在C中,函数的产生的符号是取决于函数名称,在C++中,函数产生符号取决于函数名称+形参类型+形参个数。所以上面的几个函数,在C++中可以运行,我们把这样的函数名相同但是形参列表不同的函数叫做函数重载。
2.静多态与动多态的区别
在C++中,我们区分静多态与动多态
(1)静多态:重载,模板
(2)动多态:继承,虚函数
3.重载时的一些问题
(1)我们不能仅通过返回值不同来进行重载,或者说,与返回值无关,举个栗子
 C++ Code 
1
2
void fun(int a,float b);
void fun(float a,int b);
这个也构成了函数重载,因为第一个产生的符号是fun_int_float,第二个是fun_float_int。
(2)重载时,编译器优先看实参的类型,举个栗子
 C++ Code 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
bool compare (int a, int b)
{
    cout << "compare(int ,int)" << endl;
    return b;
}

bool compare (double a, double b)
{
    cout << "compare(double ,double)" << endl;
    return b;
}

bool compare (float a, float b)
{
    cout << "compare(float ,float)" << endl;
    return b;
}

bool compare(char *a, char *b)
{
    cout << "compare(char* ,char*)" << endl;
    return strcmp(a, b) 0 true false;
}

int main()
{
     int a=2;
     int b=4;
     compare (a, b);
    return 0;
}
这样,编译器首先看实参类型为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 与引用还有很多用法,之后单独总结。

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有