从C语言过渡到C++之基本变化

 更新时间:2017年07月29日 16:32:30   作者:天花板  
在之前的C++代码训练营系列中,我试图用完成具体项目的方式给大家介绍C++,但后来大家反馈说这样从C过渡到C++有点跟不上。于是我又专门设计了这个《从C到C++》的过渡专题,我准备通过10篇文章介绍一下C++和C的重要区别。

说到C++和C语言的区别,大部分人都会想到面向对象和面向过程。然而这种说法并不准确。面向对象和面向过程指的是两种不同的程序设计思想,而C++与C是两种编程语言,难道C++就不能用于面向过程去解决问题吗,当然可以。而面向对象的设计思想也可以用到C语言中去,我之前的文章就涉及过这方面的知识。

我们这个系列就是要抛开编程思想,单纯地从语法的角度介绍一下C++中究竟加入了哪些C语言中没有的功能。希望大家在掌握了C语言之后再来学习这部分内容。

首先,让我们看一段标准的C++代码:

  // main.cpp
  #include <iostream>

  using namespace std;

  int main()
  {
    cout << "Hello World!" << endl;

    return 0;
  }

这个是一个最基本的程序,用来在屏幕上打印出“Hello World”这句话。是不是和C语言程序差距较大呢?今天,我们先介绍C++和C语言的几个最基本的不同。

1. 头文件

C语言中,标准输入输出的头文件引用方式如下:

#include <stdio.h>
而C++中使用的是:

#include <iostream>
C++规定,由系统提供的头文件在引用时不带“.h”。如果是自己定义的头文件,需要这样引用:

#include "myfile.h"
注意,这里不仅使用了“.h”而且还用了双引号。原因和C语言相同,从当前路径开始寻找。另外,由于C++是完全支持C语言的全部功能的,所以当我们要使用C语言提供的头文件时,依然要使用:

#include <stdio.h>
这样定义的好处是,我们只看头文件的包含形式就知道引用的是C++的系统库还是C语言的系统库,亦或是自定义函数库。

2. 命名空间

大家肯定注意到这句话了:

using namespace std;
这句话的意思是引入命名空间std,我们输出字符串使用的cout关键字就在std中。C++库中的函数被划分到不同的命名空间中,如果需要访问,就要先使用这句话引入命名空间。

假如我们没有写这句话,就要在每次使用到这些函数时手动指定命名空间,之前的代码就要变成这样:

// main.cpp
#include <iostream>

int main()
{
  std::cout << "Hello World!" << std::endl;

  return 0;
}

这样写是合法的,只不过有些麻烦。

3. C++的输入输出


C++的输入输出做了较大的修改,我们先看下面这个例子:

#include <iostream>

using namespace std;

int main()
{
  int a, b;

  cout << "Please input two numbers : " << endl;

  cin >> a >> b;

  cout << "a = " << a << ", " << "b = " << b << endl;

  return 0;
}

这个程序实现了输入两个数字,之后把它们打印在屏幕上。程序的执行结果如下:


cin
相当于scanf,用于把输入的字符保存在后面的变量中。cin必须和>>一起使用,需要输入几个变量就写几个变量,之间用>>分隔开。

cout
相当于printf,用于把字符串或变量打印在屏幕上。需要打印的元素要用<<分隔开,endl表示换行。

这两个关键字最大的优势是不需要关注变量的数据类型,C++会根据变量的定义自动匹配合适的数据类型。

使用这两个关键字时必须包含<iostream>这个库。

4. 变量的定义

C语言中有个被很多人诟病的规定是变量的定义必须放在代码块的首部。这样就会经常出现变量的定义和第一次使用之间距离很远,比如下面这段代码。

int main()
{
  int i, j;

  // Do something

  for (i = 0; i < 100; i++)
  {
    printf("%d\n", i);
  }

  return 0;
}

这段代码中,变量i的声明和第一次使用之间可能隔了几十行的代码。这样严重影响了代码的可读性,也提高了调试的成本。

在C++中,这种情况本根本地解决了。C++允许在任何地方定义变量,只要在使用它之前就行。于是就有了这样的写法:

for (int i = 0; i < 100; i++)
{
  // Do something
}

这样写是不是变得非常清楚了。在C++中,我们习惯在使用变量时定义,很多只会用C语言的程序员也在使用.cpp文件写代码就是为了有这么一个便利条件。

5. 一定要先学C再学C++吗

虽然我是带大家先学C语言再学C++的,很多程序员也都是走的这个学习路线。但并不是一定要先学C再学C++。

我总是用这么个例子来解释这个问题。C和C++就仿佛是手动挡和自动挡的区别,虽然我们大部分人都是先学手动挡再学自动挡,但并不能说不会开手动挡的人就学不会自动挡。自动挡其实还更好学一些。对于驾驶这两种车而言,它们有很多相同的部分,比如打方向的方法、踩油门和刹车的方法、打转向灯的方法、转弯并线等等这些要点都是相同的,只不过你先学哪个就在那里学习这些公共部分而已。

C和C++也是一样,80%以上的语法点都是相同的,而这些语法点你是通过哪种语言学会的没有任何区别。

大部分学校安排课程的时候都是先学C再学C++,因为C更关注细节,能够帮助学生更清晰地了解程序和硬件的一些关系,人们认为只要这么学才能打下好的基础。但随着计算机编程技术的不断发展,如今更流行的观点是编程就是为了帮助我们更好地使用计算机解决问题,以这个目的为导向,那些没必要知道的东西可以不去在意。于是越来越多的人用C++、Java、甚至Python这样远离硬件的语言进行编程入门。这些人依然可以设计出自己想要的程序。

所以,请大家不要再纠结先学谁后学谁的问题了,可能不久后,我就会推出从零开始学习C++这样的系列了。

敬请期待~

相关文章

  • C++List容器常用函数接口刨析

    C++List容器常用函数接口刨析

    最近我学习了C++中的STL库中的list容器,对于常用容器,我们不仅要会使用其常用的函数接口,我们还有明白这些接口在其底层是如何实现的。所以特意整理出来一篇博客供我们学习
    2022-08-08
  • 浅析顺序结构存储的栈

    浅析顺序结构存储的栈

    这篇文章主要介绍了顺序结构存储的栈,有需要的朋友可以参考一下
    2014-01-01
  • C语言函数栈帧的创建和销毁介绍

    C语言函数栈帧的创建和销毁介绍

    大家好,本篇文章主要讲的是C语言函数栈帧的创建和销毁介绍,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2021-12-12
  • C++多线程互斥锁和条件变量的详解

    C++多线程互斥锁和条件变量的详解

    这篇文章主要为大家详细介绍了C++多线程互斥锁和条件变量,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03
  • C++中使用cout以hex格式输出方式

    C++中使用cout以hex格式输出方式

    这篇文章主要介绍了C++中使用cout以hex格式输出方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • swift Character类型详解及实例

    swift Character类型详解及实例

    这篇文章主要介绍了 swift Character类型详解及实例的相关资料,需要的朋友可以参考下
    2017-06-06
  • c++智能指针的超详细讲解

    c++智能指针的超详细讲解

    c++程序设计中经常会用堆内存,程序员要自己管理内存的申请和释放,使用原始指针,容易造成堆内存泄漏(忘记释放),二次释放,使用智能指针能更好的管理堆内存,下面这篇文章主要给大家介绍了关于c++智能指针的相关资料,需要的朋友可以参考下
    2022-06-06
  • C++在C语言基础之上增强的几个实用特性总结

    C++在C语言基础之上增强的几个实用特性总结

    这篇文章主要介绍了C++在C语言基础之上增强的几个实用特性总结,包括C++中更强的类型约束以及结构体方面等一些更加高级的特性,需要的朋友可以参考下
    2016-03-03
  • C++关于引用(reference)的代码案例

    C++关于引用(reference)的代码案例

    引用是C++中的一种重要特性,它可以让代码更加高效、简洁和易读,本文将深入探讨引用的相关知识,包括引用的概念、使用方法、优点和注意事项等。建议根据给出的代码案例练一下,熟悉即可
    2023-05-05
  • C++使用string的大数取模运算(5)

    C++使用string的大数取模运算(5)

    这篇文章主要为大家详细介绍了C++使用string的大数取模运算,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-09-09

最新评论