C和C++的区别

目录

1.输入与输出

2.引用

3.inline 内联函数

4.函数默认值

5.函数重载

6.函数模板

7.new/delete

8.namespace


1.输入与输出

C:

 scanf_s();
 printf();

C++

 cin<<
 cout<<

2.引用

引用符号:&

可以理解为取别名,对引用的操作等于对本身变量的操作。

 b=10;
 int &a = b;

在函数中使用,可以直接将形参的值进行修改,因为他是直接对原变量进行操作,没有实参复制形参的过程。

 void Swap( int& a, int& b)
 {
     int c = a;
     a = b;
     b = c;
 }
 int main()
 {
     int x = 10, y = 20;
     swap(x, y);
     return 0;
 }

引用必须初始化。若对常量引用必须加const

 const int & a = 10;

3.inline 内联函数

内联函数是为了减少频繁调用小函数消耗大量栈空间所提出的。

 inline int Max(int a , int b)
 {
     return a+b;
 }

内联函数的处理方式是直接在函数调用点展开成代码段。

需要注意的是加了inline并不一定就是内联函数,编译器会自行评估是否要处理成内联函数。

如果函数中代码行数过多,或者有循环,则不会成为内联函数。

inline 函数一般写在头文件中。

inline 函数只在Release版本生效。在Debug版本是不生效。

内联函数和宏的区别:

inline函数是在编译期处理的,有安全检查和类型检查。而宏是在预编译期处理的,没有检查机制,只是简单的文本替换

内联函数和static函数的区别:

static函数处理的方式和普通函数一致,都有函数的开栈和清栈开销,只不过将函数的符号变成了局部,导致了只能在本文件使用。

内联函数没有开栈和清栈开销,由于在函数调用点进行展开,所以只有本文件可以使用。

4.函数默认值

 void fun(int a,int b, int c = 0,int d =0)
 {
     cout<<a<<b<<c<<d<<endl;
 }

C++中函数可以有默认值,如果在调用时不赋值,则会使用默认值进行传参。

注意:

只能从右到左依次进行默认值设定,不可以跳跃,例如:

 void fun(int a=1,int b, int c = 0)
 {
     cout<<a<<b<<c<<endl;
 }

这样是错误的。

在调用时,也要遵循从左到右赋值,不可以跳跃,例如:

 fun(1,2, ,4);//void fun(int a,int b, int c = 0,int d =0)

5.函数重载

函数重载是指在同一作用域中声明多个功能类似的同名函数。

为什么c++可以进行函数重载?

c语言处理函数时,产生的函数符号是将函数名直接变成_函数名,因此如果重名,在调用时则会产生冲突。

c++的在产生函数符号时,是通过函数名,返回值类型,形参列表来决定,因此在调用时可以进行区分。

注意点:

返回值类型不同,形参列表相同的函数不能重载。虽然返回值不同对应的函数名的符号不同,但是由于在使用时候,编译器可能会无法分辨出该调用哪个函数,所以就出现了错误,因此函数的返回值是不可以作为是否属于重载函数的判断标准。

同样需要注意的是,参数带有默认值时,如果产生歧义也是无法进行调用的,例如:

 int fun(int a,int b,int c,int d);
 int fun(int a,int b,int c);

在正常情况下,该函数可以进行重载,但是如果对d进行默认值设置,则可能会产生歧义。

6.函数模板

函数模板是为了解决同样的函数,或者类,但是有不同类型的参数的问题。

定义如下:

 template<typename 模板名字>
 函数
 ​
 template<class Type>
 const Type& Max( const Type& a, const Type & b)
 {
     return a > b ?a : b;
 }

注意:

函数模板并不是宏定义,而是通过在编译时期识别类型,通过typedef 模板名字 type方式进行替换。

一个是在预编译期,一个是在编译器,如下例子:

 template<class Type>
 void  fun()
 {
     Type *a,b;
 }

如果是宏替换,则会报错,因为Type不是类型名,只是一个替换,导致b并没有被定义。

7.new/delete

在C++中堆内存的分配和释放是通过new和delete来操作的。

 int main()
 {
     int * p =new int(10);//10是初始化值
     *p=100;
     delete p;
     int * p =new int[10];//开辟10个int类型大小的空间
     delete []p;//在删除连续多个空间时使用
 }

8.namespace

为了解决命名冲突的问题,c++提供了命名空间机制。

全局变量a和Sum函数定义在n1这个名字空间作用域下。作用域将其隔离起来。访问方式如下:

 namespace n1
 {
     int a;
     int Sum(int a, int b)
     {
         return a+ b;
     }
 }
 int main()
 {
     cout <<n1:a <<endl;
     int rt = n1:Sum(10,20);
     return 0;
 }

通过名字空间作用名称加上作用于访问符::的方式进行访问。除了上述的访问方式外,C++中还提供了另外两种的访问方式。

1.using声明

 int main()
 {
     using n1:a;
     using n1::Sum;
     cout<<a<<endl;
     int rt = Sum(10, 20);
     return 0;
 }
 

2.using指示符

using 指示符是将using 指示符后名字空间作用域下的所有符号暴露在using 指示符所在的作用域。

 int main()
 {
     using namespace n1;
     cout<<a<<endl;
     int rt = Sum(10, 20);
     return 0;
 }

如果同一项目出现同名的命名空间,将会把命名空间作用域进行合并。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值