zoukankan      html  css  js  c++  java
  • 细数C++和C的差别

    C++语言是对C语言的扩展。所以熟悉C语言的人会发现。本书的第01~18章讲的内容基本上和C语言的内容差点儿相同。

    C++一方面对C语言的语法进行了改动。还有一方面又加入一些新的概念。

    C++中新增的概念有:bool类型、引用(14章)、类(19~24章)、模板(25~26章)、异常(27章)。

    C++相对于C有变化的语法点有:变量分散定义、函数名重载、struct语法。本章着重是比較分析这几个有变化的语法点。

     本篇选自《C/C++学习指南》,附录14

     权利声明:作者拥有本书的所有权利。作者授权不论什么人都能够自由转载本站点发布的内容,但转载时必须遵守下面限制: ①转载时必须全文转载。不得有不论什么改动,必须包括权利声明官网地址”  仅限于网络转载。即终于结果发布于网络上。凡是不遵守以上两条的转载行为视为侵权行为。除非本人同意,不论什么人不得将本站点内容内容用于不论什么的其它用途。 
    官网地址: http://www.afanihao.cn/  留言请到http://www.afanihao.cn/kbase/ 

    1.1         在项目里加入c文件

    当文件以.c作为后缀时。编译器以C语言的语法对该文件进行编译。当文件以.cpp作为后缀时。编译器以C++的语法标准对其进行编译。所以,文件的后缀名是有这个约定的,不可以随便更改。

    在加入文件时,输入文件名称的后缀是.c,那在编辑这个文件时必须遵守C语言的语法,例如以下图所看到的。

    1.2         变量分散定义

    这一点在第8章介绍函数略有介绍。

    在C语言中,全部的局部变量必须在函数或复合语句的最前面集中定义。简单地说就是变量定义语句要放在前面。不然就报语法错误。

    以下的main.c(C语言)代码中,局部变量a,b的均在函数体的前部定义。因而符合C语言的语法要求,

    ////////////// main.c //////////
    #include <stdio.h>
    void main()
    {
          int a;  // 变量定义
          int b;  // 变量定义
     
          a = 10;
          printf("a=%d 
    ", a);
     
          b = 11;
          printf("b=%d 
    ", b);
    }

    以下的main.c(C语言)代码中,局部变量c的定义没有放在前面。不符合C语言的语法要求,因而编译报错,

    ////////////// main.c //////////
    #include <stdio.h>
    void main()
    {
          int a;  // 变量定义
          int b;  // 变量定义
     
          a = 10;
          printf("a=%d 
    ", a);
     
          b = 11;
          printf("b=%d 
    ", b);
     
          int c ; // 变量定义语句不能放在这里
          c = a + b;
          printf("c=%d
    ", c);
    }

    显然,这样对于程序猿来说是非常不方便的。于是C++语言去掉了这个限制,让程序猿能够随时随地的定义变量。

    1.3         函数名重载

    C++同意多个函数使用同样的函数,这称为函数名重载。

    而这在C语言中是万万不能够的,在C语言中,全局函数名是不能反复的。比如,在以下的main.c文件里,存在两个名称同样的全局函数do_something,导致编译器报错。

    ////////////// main.c //////////
    #include <stdio.h>
     
    void do_something(int x, int y)
    {
          printf("int , int 
    ");
    }
    void do_something(double x, double y)
    {
          printf("double , double 
    ");
    }
    void main()
    {
       printf("test");
    }

    这个问题的本质是,在C语言中,以函数名来唯一区分一个全局函数。换句话说,函数名就是函数的唯一ID,显然ID这个东西是不能冲突的。

    这导致了在C语言中,给函数起名字也成了一个比較麻烦的事情,对于功能类似的函数,因为不能起同样的名字,所以仅仅好不停地加一些后缀以示差别。比如,

    do_something_int_int()

    do_something_double_double()

    假设你将来阅读一些C语言的代码,相信会有此感受。

    C++针对此问题的改进是:以函数名+參数列表来唯一区分函数

    所以。在C++中函数名是同意同样的,仅仅要參数列表有所不同就不会冲突。

    文本框: 注:在同一个项目中。一般要么所有是.c后缀,按C语法编写;要么是.cpp后缀。按C++语法来编写。可是也存在混用的情形。这样的情况有一定难度。參考还有一篇附录《C++与C的混合调用》。 

    1.4         struct定义

    在C语言中, struct类型的定义必须加上struct的前缀,

    双括号: ////////////// main.c //////////#include <stdio.h>struct Object{	int id;	char name[128];};void main(){	struct Object obj; // C语言里必须加上struct前缀	obj.id = 1;}

    而在C++中,struct能够直接使用其类型名来定义

    双括号: ////////////// main.cpp //////////#include <stdio.h>struct Object{	int id;	char name[128];};void main(){	Object obj; // C++里不需要加struct前缀	obj.id = 1;}

    相比之下,应该是C++的语法更简洁一些。所以在用C语言编写代码的时候,老是要加一个struct前缀会让人认为不耐烦。所以C程序猿一般是这么来定义的struct的。在以下的代码中,使用typedef来定义一个object_t的类型。

    双括号: ////////////// main.cpp //////////#include <stdio.h>typedef struct {	int id;	char name[128];} object_t;void main(){	object_t obj;	obj.id = 1;}

    在C语言的世界里,这么定义struct是通用模式。为的就是在使用的时候少写一个struct前缀。

    (可见C程序猿有多么无耐)。

    在须要定义链表的时候,C程序猿有两种写法。

    struct  Object
    {
         int id;
         struct Object * next;  //
    };
    或
    typedef struct  _tag_object
    {
         int id;
         struct _tag_object * next;
    }object_t;

    相同的,C程序猿会选择另外一种定义方法,唯一目的就是为了在使用的时候少写一个keywordstruct而已。       

    1.5         C++中的struct

    实际上,C++对struct进行提全面的升级,以至于C++的struct差点儿全然等效于class的语法了。凡是class支持的语法。包含成员函数、public/private、继承等所有的语法,struct也都所有支持且意义不变。也就是说,struct是class的同义语(略有区别,后面讲到)。

    唯一的一点小差别:对于struct。假设没有声明不论什么改动符(public/protected/private)。则默认全部成员是public的。这一点上class相反,class默认是private的。

  • 相关阅读:
    每天一道LeetCode--141.Linked List Cycle(链表环问题)
    每天一道LeetCode--119.Pascal's Triangle II(杨辉三角)
    每天一道LeetCode--118. Pascal's Triangle(杨辉三角)
    CF1277D Let's Play the Words?
    CF1281B Azamon Web Services
    CF1197D Yet Another Subarray Problem
    CF1237D Balanced Playlist
    CF1239A Ivan the Fool and the Probability Theory
    CF1223D Sequence Sorting
    CF1228D Complete Tripartite
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/5182664.html
Copyright © 2011-2022 走看看