从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++这样的系列了。

敬请期待~

(0)

相关推荐

  • C语言实现俄罗斯方块小游戏

    C语言实现俄罗斯方块小游戏的制作代码,具体内容如下 #include <stdio.h> #include <stdlib.h> #include <unistd.h> #define TTY_PATH "/dev/tty" #define STTY_ON "stty raw -echo -F" #define STTY_OFF "stty -raw echo -F" int map[21][14]; char

  • 从C语言过渡到C++之const

    1. 定义常量 1.1 C语言中定义常量的方法 在C语言从零开始这个系列中,我们讲了C语言定义常量的方法.没有看过的同学请参考:C语言从零开始(五)-常量&变量 为什么要定义常量我就不再赘述了,这里重点说说这么定义有什么不好.经常有这样的面试题:请写出下面这段代码的执行结果: #include <stdio.h> #define SUM 5 + 1; void main() { int a = 2 * SUM; printf("%d", a); } 经常有人答12,

  • C语言实现静态顺序表的实例详解

    C语言实现静态顺序表的实例详解 线性表 定义一张顺序表也就是在内存中开辟一段连续的存储空间,并给它一个名字进行标识.只有定义了一个顺序表,才能利用该顺序表存放数据元素,也才能对该顺序表进行各种操作. 接下来看看静态的顺序表,直接上代码: SeqList.h #define _CRT_SECURE_NO_WARNINGS 1 #ifndef __SEQLIST_H__ #define __SEQLIST_H__ #include <stdio.h> #include <stdlib.h&g

  • C语言模拟实现atoi函数的实例详解

    C语言模拟实现atoi函数的实例详解 atoi函数,主要功能是将一个字符串转变为整数,例如将"12345"–>12345.但在实现过程中,我们难免会因为考虑不够全面而漏掉比较重要的几点,今天就总结一下实现atoi函数需要注意的地方. 1.指针为NULL 2.字符串为空字符串 3.空白字符 4.正号与负号问题 5.溢出问题 6.异常字符处理 接下来看代码:(具体几种问题处理都在代码的注释中说明) #define _CRT_SECURE_NO_WARNINGS 1 #include

  • C语言实现2048小游戏

    本文实例为大家分享了C语言实现2048小游戏的具体代码,供大家参考,具体内容如下 具有以下特点: 1.linux下完成 2.非堵塞键盘读取 3.随机生成2和4 #include <stdio.h> #include <stdlib.h> #include <unistd.h> #define TTY_PATH "/dev/tty" #define STTY_ON "stty raw -echo -F" #define STTY_O

  • C语言实现C++继承和多态的代码分享

    这个问题主要考察的是C和C++的区别,以及C++中继承和多态的概念. C和C++的区别 C语言是面向过程的语言,而C++是面向对象的过程. 什么是面向对象和面向过程? 面向过程就是分析解决问题的步骤,然后用函数把这些步骤一步一步的进行实现,在使用的时候进行一一调用就行了,注重的是对于过程的分析.面向对象则是把构成问题的事进行分成各个对象,建立对象的目的也不仅仅是完成这一个个步骤,而是描述各个问题在解决的过程中所发生的行为. 面向对象和面向过程的区别? 面向过程的设计方法采用函数来描述数据的操作,

  • C语言中strlen() strcpy() strcat() strcmp()函数的实现方法

    strlen函数原型:unsigned int strlen(const char *);返回的是字符串中第一个\0之前的字符个数. 1.strcat函数原型char* strcat(char* dest,const char* src); 进行字符串的拼接,将第二个字符串连接到第一个字符串中第一个出现\0开始的地方.返回的是拼接后字符的首地址.并不检查第一个数组的大小是否可以容纳第二个字符串.如果第一个数组的已分配的内存不够容纳第二个字符串,则多出来的字符将会溢出到相邻的内存单元. 2.str

  • C语言去除相邻重复字符函数的实现方法

    C语言去除相邻重复字符函数的实现方法 字符去重函数 功能:去重字符串相邻重复的字符,不相邻的不用去重 参数: arg1 -- 输入字符串 arg2 -- 字符串开始位置 arg3 -- 字符串结束位置 要求: 输入参数为arg1时, 对这个字符串去重 输入参数为arg1,arg2时, 从arg2位置到字符串结束,去重 输入参数为arg1,arg2,arg3时,从arg2到arg3位置,去重 src/include/catalog/pg_proc.h DATA(insert OID = 6669

  • 从C语言过渡到C++之引用(别名)

    今天要讲的是C++中我最喜欢的一个用法--引用,也叫别名. 引用就是给一个变量领取一个变量名,方便我们间接地使用这个变量.我们可以给一个变量创建N个引用,这N + 1个变量共享了同一块内存区域. 1. 声明引用 创建引用的格式如下: 数据类型 引用名 = 原变量 比如: int a = 1; int& b = a; 在这段代码中,我们给变量a创建了一个别名b.它们公用同一块内存区域,就是创建变量a时申请的区域. 注意:由于引用并不需要申请一块新的内存空间,因此在建立引用时只能声明,不能定义. 面

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

    说到C++和C语言的区别,大部分人都会想到面向对象和面向过程.然而这种说法并不准确.面向对象和面向过程指的是两种不同的程序设计思想,而C++与C是两种编程语言,难道C++就不能用于面向过程去解决问题吗,当然可以.而面向对象的设计思想也可以用到C语言中去,我之前的文章就涉及过这方面的知识. 我们这个系列就是要抛开编程思想,单纯地从语法的角度介绍一下C++中究竟加入了哪些C语言中没有的功能.希望大家在掌握了C语言之后再来学习这部分内容. 首先,让我们看一段标准的C++代码: // main.cpp

  • C语言为何不会过时?你需要掌握多少种语言?

    01为什么C语言不会过时 评价任何一门编程语言,都是招人骂的.永远是这样.就像是春寒料峭的季节, 街上穿棉袄和穿单衣的擦肩而过,双方一定是同时在心里出现了两个字:"s b!"这个在心理学上有个专业的名字:叫做"二b"现象! 先说一个表,这个就是著名的TIOBE语言排行榜.目前它是一个最权威的一个语言流行度的排行榜,从这个排行榜上看,你会得到一个最直观的结论.Java和C都在下降,而下降的部分被第三名以后的语言所瓜分. 而就在5月,时隔5年,C语言再次领先Java,荣

  • 为什么说C语言是永不过时的语言

    目录 01为什么C语言不会过时 02为什么 C 语言仍然占据统治地位? 03 C语言为何值得去学 04 除了C语言,需要掌握多种编程语言吗? 01为什么C语言不会过时 评价任何一门编程语言,都是招人骂的.永远是这样.就像是春寒料峭的季节, 街上穿棉袄和穿单衣的擦肩而过,双方一定是同时在心里出现了两个字:"s b!"这个在心理学上有个专业的名字:叫做"二b"现象! 先说一个表,这个就是著名的TIOBE语言排行榜.目前它是一个最权威的一个语言流行度的排行榜,从这个排行榜

  • 深入C# 4.0 新特性dynamic、可选参数、命名参数的详细介绍

    1.dynamic ExpandoObject熟悉js的朋友都知道js可以这么写 : 复制代码 代码如下: var t = new Object(); t.Abc = 'something'; t.Value = 243; 现在这个js动态语言的特性,我们也可以在c#中使用了,前提是将一个变量声明为ExpandoObject类型.如下例: 复制代码 代码如下: static void Main(string[] args) { dynamic t = new ExpandoObject(); t

  • 如何在Go中使用切片容量和长度

    来做一个快速测验-以下代码输出什么? vals := make([]int, 5) for i := 0; i < 5; i++ { vals = append(vals, i) } fmt.Println(vals) Run it on the Go Playground → https://play.golang.org/p/7PgUqBdZ6Z 如果猜到了[0 0 0 0 0 0 1 2 3 4],那么你是正确的. 等一下为什么不是[0 1 2 3 4]? 如果答错了,也不担心.从其他语言

  • Android开发之Activity详解

    [Activity] 一个Activity是一个应用程序组件,提供一个屏幕,用户可以用来交互为了完成某项任务,例如拨号.拍照.发送email.看地图.每一个activity被给予一个窗口,在上面可以绘制用户接口.窗口通常充满屏幕,但也可以小于屏幕而浮于其它窗口之上. 一个应用程序通常由多个activities组成,他们通常是松耦合关系.通常,一个应用程序中的activity被指定为"main"activity,当第一次启动应用程序的时候呈现给用户的那个activity.每一个activ

  • Java老矣 尚能饭否?

    22 岁,对于一个技术人来说可谓正当壮年.但对于一门编程语言来说,情况可能又有不同.各类编程语言横空出世,纷战不休,然而 TIOBE 的语言排行榜上,Java 却露出了明显的颓势.这个老牌的语言,未来会是怎样? 写在前面 从 1995 年第一个版本发布到现在,Java 语言已经在跌宕起伏中走过了 22 年,最新的 Java 版本也已经迭代到 Java 9.当年 Java 语言的跨平台优势如今看来也只不过是家常小菜,Go.Rust 等语言横空出世,进一步拓宽了编程语言的边界.当年发明 Java 语

  • 终于了解了下.net 和 j2ee的区别

    关于.NET技术与Sun公司的Java2企业版(J2EETM)相比较,许多客户都想了解Microsoft公司的观点.由于以下的几个原因,.NET和JEE的比较有点棘手: 1)   一般来说,Windows .NET Framework是Microsoft的Windows系统中经过精心定义的技术部分,而J2EE则是一个书面的协议.如果不局限于学术方面的讨论,换句话说,就是在几个应用平台上讨论这个话题的商业价值,那么仅仅比较J2EE和一个实际应用的工具是没有意义的. 这样实际应用的工具如:IBM公司

随机推荐