C和C++的区别

1、默认值

默认值需从右至左给出,不能跳跃性的给出。

声明可写多次,但默认值只能给一次。

int sum(int a,int b=10);//√
int sum(int a=20,int b);//error
2、内联函数

①C++中的内联函数,在调用点把代码直接展开(编译阶段)。

感觉和#define类似,那么这两个之间有什么区别呢?

宏:在预编译阶段进行替换,没有进行类型检查,所以不安全

内联函数:在编译阶段处理,进行类型检查,安全性好,所以又叫更安全的宏

例:

#define Max(a,b) a>b ? a:b
..
int a=MAx(10,20)+20;//a=10>20?10:40
..
②内联函数和普通函数的区别

内联函数不需要开辟栈桢,清理栈桢,而普通函数需要进行栈桢的开辟和清理。

内联函数定义一般都写在头文件,普通函数只在头文件中声明。

普通函数生成的符号属性是global,inline不生成符号。

如果栈桢开辟的开销 > 函数执行的开销,那么可将此函数写成inline函数。

③inline和static函数的区别

static函数需要开辟栈桢,清理栈桢

static函数生成的符号属性是local,inline不生成符号。

相同点:只在本文件有效。

④inline只在release版本生效,debug版本不起作用

inline知识给编译器一个建议

⑤inline函数对递归函数不起作用

因为递归函数在编译阶段不能知道它调用的次数,就无法展开代码,所以inline函数对递归函数不起作用。

3、函数重载

C语言中函数产生符号--->函数名称

C++中函数产生符号--->函数名称+形参列表

例:

bool Compare(int a,int b)//Compare_int_int
{
     return a==b;
}...//还有double,char*类型,实现都一样在此就不写了
int main()
{
     bool Compare(int a,int b);//在局部声明了之后,调用时会调用形参是int的
     Compare(10,20);//Compare_int_int
     Copmare(10.5,20.5);//Compare_double_double  double可以强转成int
     Compare("hello word");//Compare_char_char  会出错 因为char*不能转成int
}
类型转换:


蓝色:无条件转换,自动转换

红色:强制类型转换

例:

unsigned a=1;
char b=-1;
char c=a>b?'a':'b'
cout<<c<<endl;
输出:b
short a=1;
char b=-1;
char c=a>b?'a':'b'
count<<c<<endl;
输出:a

4、C和C++的相互调用

extern 'C'告诉编译器按照C语言的规则生成符号

(1)在C++中调用C

extern ‘C’
{
    int sum(int a,int b);//此函数的实现在.c里面
}
int main()
{
    sum(20,30);
}

(2)在C中调用C++

.c中有一个声明,.cpp中定义,想要在.c中调用

解决方案:①已知cpp中的定义以及实现,把定义及实现括在extern 'C'中

                  ②不知道.cpp中的实现

加一个中间文件(.cpp)

.cpp中

#ifdef_cplusplus
extern 'C'
{
    #endif
    int sum(int a,int b)
   {
        return a+b;
   }
    #ifdef_cplusplus
}
#endif
.cpp(中间文件)

int sum(int a,int b);
 extern 'C'
{
     int mysum(int a,int b)
   {
          return sum(a,b);
   }
}
.c文件

int mysum(int a,int b);
int main()
{
     mysum(a,b);
     return 0;
}

5、const

在C语言中:

不一定要初始化,const修饰的量叫做常变量。const修饰的常变量定义以后,不能做左值,与普通变量编译方式一样。

在C++中:

const修饰的量叫常量,所有使用常量名的地方全部替换成常量的初始值。所以在C++中可以定义int arr[a];而C中不行。

需要注意的是,引用一个编译阶段不明确的值的时候常量就退化成为常变量。

如:

int b=20;

const int a=b;

int arr[a]={0};//这句就会出错

6、引用(&)

取地址的符号和引用的符号一样都是&,区分很简单,&前面有类型是引用,没有是取地址。

(1)定义引用必须初始化

(2)初始化的值必须要能取地址

(3)引用不能改变,int &a=b;&a=c;//error

(4)访问引用变量,永远访问的是它所引用的内存

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值