zoukankan      html  css  js  c++  java
  • C到C++的升级

    1,C 与 C++ 的关系:

     

        1,C++ 继承了所有 C 的特性;

        2,C++ 在 C 的基础上提供了更多的语法和特性;

        3,C++ 的设计目标是运行效率与开发效率的统一;

           1,运行效率和开发效率非常高;

       

    2,C++ 更强调语言的实用性,

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

    1 int c = 0;
    2        
    3 for(int i=1; i<=3; i++)  // 使用时定义;
    4 {
    5     for(int j=1; j<=3; j++)
    6     {
    7      c += i * j;
    8     }
    9 }

        2,C 语言中的变量都必须在作用域开始的位置定义;

           1,比如 main() 函数最开始的地方,否则报错;

          

    3,register 关键字请求编译器将局部变量存储于寄存器中(可有可无的鸡肋):

        1,在 C++ 中依然支持 register 关键字;

        2,C++ 编译器有自己的优化方式;

           1,C 语言中无法获取 register 变量的地址;

           2,C++ 中可以获取 register 变量的地址;

           3,C++ 编译器基本不关心 register 是否存在,

               1,C++ 编译器发现程序中需要取 register 变量的地址时,register 对变量的声明变的无效;

               2,早期 C 语言编译器不会对代码进行优化,因此 register 变量是一个很好的补充;

              

    4,在 C 语言中,重复定义多个同名的全局变量是合法的,但是在 C++ 中不允许定 义多个同名的全局变量:

        1,C 语言中多个同名的全局变量最终会被链接到全局数据区的同一个地址空间上;

        2,C++ 直接拒绝这种二义性的做法;

       

    5,实例分析:C 到 C++ 的升级一

        1,main() 函数:

     1 #include <stdio.h>
     2 
     3 int g_v;
     4 //int g_v;  // C++ 中不允许定义多个同名全局变量;
     5 
     6 int main(int argc, char *argv[])
     7 {
     8     printf("Begin...
    ");
     9     
    10     int c = 0;  // C 中必须在作用域开始的地方;
    11     
    12     for(int i=1; i<=3; i++)  // 使用时定义;
    13     {
    14         for(int j=1; j<=3; j++)
    15         {
    16             c += i * j;
    17         }
    18     }
    19     
    20     printf("c = %d
    ", c);
    21     
    22     register int a = 0;  // 新版本 C++ 编译器直接忽略;
    23     
    24     printf("&a = %p
    ", &a);  // 旧版本 C++ 编译器中在这里会忽略 register 关键字;
    25     
    26     printf("End...
    ");
    27     
    28     return 0;
    29 }

     

    6,struct 关键字的加强:

     

        1,C 语言中的 struct 定义了一组变量的集合;

           1,并不是真正的类型;

        2,C 语言中 struct 定义的标识符并不是一种新的类型;

           1,可以通过 typedef 重命名,当做一个类型来使用,但是 C 编译器不认为这是个类型;

        3,C++ 中的 struct 用于定义一个全新的类型;

           1,类型加强;

       

    7,int f() 与 int f(void) 有什么区别:

        1,C++ 中所有的标识符都必须显示的声明类型;

        2,C 语言中的默认类型在 C++ 中是不合法的;

    1 f(i)  // C 中函数定义时没有给出参数或返回值类型,则默认为 int  类型,则 f() 返回值为 int,参数 i 类型为 int;
    2 {
    3      printf("i = %d
    ", i);
    4 }
    5 
    6 g()  // g() 返回值为 int,参数为任意类型;
    7 {
    8      return 0;
    9 }

        3,在 C 语言中:

           1,int f() 表示返回值为 int,接受任意参数的函数;

               1,参数个数和类型任意;

           2,int f(void) 表示返回值为 int 的无参函数,可省略 int 写为f(void);

               1,默认参数类型;

               2,void 表示不接受任何参数;

                  1,有二义性,不利于维护,现在很少利用;

        4,在 C++ 中:

           1,int f() 和 int f(void) 具有相同的意义:

               1,表示返回值为 int 的无参函数;

               2,int f(void) 只是为了兼容 C 语言;

               3,C++ 中对类型检查非常严格,不允许有默认类型发生;

        5,答案:

           1,它们是否有区别,要看用什么编译器,如果用 C 语言编译器,这两种写法有区别;

           2,如果是 C 语言编译器,前面一种写法是返回值为 int,参数任意多,后一种写法是返回值为 int,不接受任何参数;

           3,如果是 C++ 编译器,两种写法没有区别;

              

    8,实例分析:C 到 C++ 的升级二

        1,main.cpp 文件:

     1 #include <stdio.h>
     2 
     3 struct Student
     4 {
     5     const char* name;
     6     int age;
     7 };
     8 
     9 f(i)  // C++ 中错误;
    10 {
    11     printf("i = %d
    ", i);
    12 }
    13 
    14 g()  // C++ 中错误;
    15 {
    16     return 5;
    17 }
    18 
    19 int main(int argc, char *argv[])
    20 {
    21     Student s1 = {"Delphi", 30};
    22     Student s2 = {"Tang", 30};
    23     
    24     f(10);  // C 中打印:10;
    25     
    26     printf("g() = %d
    ", g(1,2,3,4,5));  // C 中打印:5;
    27     
    28     return 0;
    29 }

     

    9,小结:

        1,C++ 更强调实用性,可以在任意的地方声明变量;

        2,C++ 中的 register 只是一个兼容的作用;

        3,C++ 编译器能够进行更好的优化;

        4,C++ 中的 struct 定义了全新的类型;

        5,C++ 中的任意标识符都必须显示的指明类型;

           1,不允许默认类型发生;

     

    此文为作者学习唐佐林老师的学习笔记,仅为交流共享之用,由此带来的后果,与作者无关;转载请注明转载出处;难免有错,欢迎指正,联系方式qunchao24@sina.com。
  • 相关阅读:
    分布式缓存技术PK:选择Redis还是Memcached?
    Redis实战:如何构建类微博的亿级社交平台
    Redis内存使用优化与存储
    微信小程序 Image 图片实现宽度100%,高度自适应
    小程序跳转、请求、带参数请求小例子
    微信小程序 全局变量
    免费ftp服务器FileZilla Server配置
    分享一次在Windows Server2012 R2中安装SQL Server2008
    C# litJson 使用方法
    HttpHandler和ashx要实现IRequiresSessionState接口才能访问Session信息(转载)
  • 原文地址:https://www.cnblogs.com/dishengAndziyu/p/10902387.html
Copyright © 2011-2022 走看看