IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C++专题1:C++和C的一些差异 -> 正文阅读

[C++知识库]C++专题1:C++和C的一些差异

C++和C的一些差异

C语言是一种面向过程的语言,而C++是面向对象,C++在语法上比C语言更加严谨,下面我们列出一些他们之间的差异。

1.const修饰变量的差异

我们知道const修饰的变量往往意味着他的值无法被修改!但是在C语言中我们仍然可以使用指针来改变,看看下面这段代码在C语言中和在C++环境中编译结果有何差异。

#include <stdio.h>

int main()
{
    const int a=5;
    int *p=&a;
    *p=10;
    printf("a=%d\n",a);
}

运行结果如下图:可以发现虽然出现了警告但是运行后a的值发生了改变,可以看出C语言在一些语法上是不严谨的

那如果在C++环境下呢:可以看到我们编译器直接报了错误

2. define:在C语言中我们使用define来定义一些常量,但是在C++中一般不使用define而使用const

3.引用

引用也可以理解为给变量起别名,它有两种功能。

1.作为参数:形参改变就是实参改变(相当于直接操作实参本身,并没有进行赋值开辟新的形参地址空间)

2.作为返回值:返回的是变量本身而不是变量的值

例:

int a=5;

int &b=a;(a,b的地址都是一样的,b又可以叫a的别名)

还记得在C语言中我们要写一个函数来实现变量值的交换我们是怎么做的吗?我们使用了值传递,将变量的地址传给函数形参的指针变量来实现,而在C++中我们还可以使用引用来实现这个功能

代码如下:

   #include <stdio.h>
   void swap(int &a,int &b)
   {
      int temp;
      temp=a;
      a=b;
      b=temp;
  }
  int main(int argc,char* argv[])
  {
      int a,b;
      a=5;
      b=6;
      printf("a=%d b=%d\n",a,b);
      swap(a,b);
      printf("a=%d b=%d\n",a,b);
 
  }

运行结果如下:我们实现了交换的功能

如果引用作为函数返回值又会如何呢?让我们看看下面这段代码:我们函数返回值类型是int&,这说明我们返回的是变量而不是一个值,怎么检验我们的结论呢,我们在主函数中对返回值进行赋值如果返回值是一个值那么对他进行赋值操作就是错误的,反之正确

 #include <stdio.h>
    
 int& setval(int &a)
 {
      a=10;
      return a;
 }

 int main(int argc,char* argv[])
  {
      int a;
      a=5;
      printf("a=%d\n",a);
      setval(a)=10;
      printf("a=%d\n",a);
  
  }

?让我们看看结果:我们的结论是正确的!

?4.函数重载

在C语言中我们知道不同的函数,名字是不能重复的,但是在C++中我们可以使用相同的函数名,但是他的类型和参数不同

1.行为相似,但是逻辑不同使用重载。

2.行为相同,逻辑相同使用模板。

我们来看一段代码理解一下什么是重载:

#include <stdio.h>

int add(int a, int b)
{
    printf("111111\n");
    return a + b;
}

int add(int a, int b, int c)
{
    printf("2222222\n");
    return a + b + c;
}

double add(int a, double b)
{
    printf("33333333\n");
    return a+b;
}


int main()
{
    int a = 1,b = 2,c = 3;
    double d = 4.13,e = 3.14;
    /*
	第一个和第二个是参数的个数不同
	第一个和第三个是参数的类型不同
	他们都会自动匹配调用相应的函数
   */
    add(a,b);  
    add(a,b,c);
    add(a,d);

}

5.默认参数

默认参数只能写在函数声明中:

传参只能从左往右

默认参数一定是从右到左

注意:重载和默认参数可能会发生冲突!!!注意避免

看看代码:

#include <stdio.h>

int add(int i, int j = 2, int k = 3);
int add(int i, int j);

int add(int i, int j, int k)
{
    return i + j + k;
}

int add(int i, int j)
{
    return i + j;
}



int main()
{
    int i = 5, j = 6;

    printf("%d\n", add(i));
//add(i,j) 这里不知道是使用三个参数的还是使用两个的所有会有歧义
}

6.空指针

C中NULL代表空指针,是0地址,不仅可以赋值给指针变量

C++中用nullptr代指无效指针,只能赋值给指针变量!

7.mutable修饰的变量可以被更改(主要用于对象类),不能和const,static直接连用。

8.内敛函数

关键字:inline( 一般在函数声明的位置直接实现)

直接展开函数体,效率更高

限制:适用于逻辑简单的函数,不会有复杂逻辑(比如switch for等语句)一般不超过5行

9.开辟空间

1.C:用malloc开辟空间,free释放

2.C++:new开辟(new不是函数没有返回值,用异常来处理失败的情况)delete释放

例:

int *p=new int; //int *p=new int[3];

delete p;//delete [ ]p;

10.作用域

C:作用域区分为全局和局部

C++:全局,局部,名词空间作用类(namespace),类作用域(class)

11.全局变量

int a;

int a=5;

C中不会报错

C++中会报错

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-07-20 18:34:21  更:2022-07-20 18:36:12 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/13 14:39:02-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码