zoukankan      html  css  js  c++  java
  • C++学习笔记(一):C到C++的升级

    0x01 C与C++的关系

    • C++继承了所有C的特性
    • C++在C的基础上提供了更多的语法和特性
    • C++的设计目标是运行效率与开发效率的统一

    C++ 以C语言为基础,增加了对面向对象的支持,并做了类型加强、函数加强、异常处理等优化。

    0x02 C到C++的升级

    1. C++更强调语言的实用性

    2. 所有的变量都可以在需要使用时再定义(在C语言中的变量都必须在作用域开始的位置定义)

    3. C++中依然支持register关键字,但是C++编译器有自己的优化方式

      • C语言中无法获取register变量的地址
      • C++中可以取得register变量的地址
      • C++编译器发现程序中需要取register变量的地址时,register对变量的声明变得无效。
    4. C++中不允许定义多个同名的全局变量(C中重复定义多个同名的全局变量是合法的,这些同名的全局变量最终会被链接到全局数据区的同一个地址空间)

    5. struct关键字的加强

      • C语言中的struct定义了一组变量的集合
      • C语言中struct定义的标识符并不是一种新的类型
      • C++中的struct用于定义一个全新的类型
    6. C++中所有的标识符都必须显示的声明类型(C语言中的默认类型在C++中是不合法的)

    0x03 实例分析一

    对上述的C到C++升级的特性(1、2、3、4),用代码的方式直观的来感受

    #include <stdio.h>
    
    int g_v;
    int g_v;
    
    int main(int argc, char *argv[])
    {
        printf("Begin...
    ");
        
        int c = 0;
        
        for(int i=1; i<=3; i++)
        {
            for(int j=1; j<=3; j++)
            {
                c += i * j;
            }
        }
        
        printf("c = %d
    ", c);
        
        register int a = 0;
        
        printf("&a = %p
    ", &a);
        
        printf("End...
    ");
        
        return 0;
    }
    

    上面贴出的代码用来感受C++的以下三个特性:

    • 所有的变量都可以在需要使用时再定义

      for(int i=1; i<=3; i++)
          {
              for(int j=1; j<=3; j++)
              {
                  c += i * j;
              }
          }
      
    • C++中可以取得register变量的地址

      register int a = 0;
          
      printf("&a = %p
      ", &a);
      
    • C++中不允许定义多个同名的全局变量

      #include <stdio.h>
      
      int g_v;
      int g_v;
      

    编译运行结果

    • C语言编译运行结果:

    C语言编译结果

    • C++ 编译运行结果:

    C++编译结果

    实例分析二

    对上述的C到C++升级的特性(5、6),用代码的方式直观的来感受

    #include <stdio.h>
    
    struct Student
    {
        const char* name;
        int age;
    };
    
    f(i)
    {
        printf("i = %d
    ", i);
    }
    
    g()
    {
        return 5;
    }
    
    
    int main(int argc, char *argv[])
    {
        Student s1 = {"Delphi", 30};
        Student s2 = {"Tang", 30};
        
        f(10);
        
        printf("g() = %d
    ", g(1,2,3,4,5));
        
        return 0;
    }
    
    

    上面贴出的代码用来感受C++的以下两个特性:

    1. struct关键字的加强
      • C语言中的struct定义了一组变量的集合
      • C语言中struct定义的标识符并不是一种新的类型
      • C++中的struct用于定义一个全新的类型

    C和C++中结构体的等价定义如下:

    //C语言定义如下:
    typedef struct _tag_student Student;
    struct _tag_student
    {
        const char* name;
        int age;
    };
    
    //C++定义如下:
    struct Student
    {
        const char* name;
        int age;
    }
    
    1. C++中所有的标识符都必须显示的声明类型

      • 在C语言中:
        • int f()表示返回值为int,接受任意参数的函数
        • f(void)表示返回值为int的无参数函数
      • 在C++中:
        • int f()与int f(void)具有相同的意义:表示返回值为int的无参函数

    0x04 一道面试题的回答

    int f()与int f(void)有区别吗?

    有区别,也没有区别,有没有区别要看是在C语言中使用还是在C++中使用,如果在C中,那就是有区别,在C++中那就没有区别了,因为在C++中所有的标识符都必须显示的声明类型,不允许二义性存在,这是对C的一个升级,因为在C中参数为空时,可以接收任意多个参数。

    参考来源:http://www.dt4sw.com/

  • 相关阅读:
    IntelliJ IDEA 2020.1.1中java web项目的配置
    Js查漏补缺10-数组、栈、队列、回调函数等
    Js查漏补缺09-this对象
    Js查漏补缺08-闭包
    Js查漏补缺07-匿名函数应用到的框架
    Js查漏补缺06-匿名函数的用法
    Js查漏补缺05-函数
    Js查漏补缺04-Object类型
    Js查漏补缺03-循环结构
    Runnabler
  • 原文地址:https://www.cnblogs.com/askta0/p/11704837.html
Copyright © 2011-2022 走看看