Chinaunix首页 | 论坛 | 博客
  • 博客访问: 251552
  • 博文数量: 52
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1538
  • 用 户 组: 普通用户
  • 注册时间: 2013-04-24 07:45
个人简介

生活就像海洋,只有意志坚强的人,才能到达彼岸。

文章存档

2013年(52)

分类: C/C++

2013-08-29 10:58:42

一、C与C++的关系

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

    C++是以C语言为基础的面向对象支持的一种程序设计语言,相比于C语言而言,它的类型、函数加强了,异常处理加强了。

二、C++对C的加强

    1> C++中更强调语言的“实用性”,所有的变量都可以在需要使用时在定义。而C语言中的变量都必须在作用域开始的位置定义。

例:
   

点击(此处)折叠或打开

  1. int c = 0;
  2.     
  3.     printf("Begin...\n");

  4.     for(int i = 0; i < 10; i++)
  5.     {
  6.         for(int j = 0; j < 10; j++)
  7.         {
  8.             c += i * j;
  9.         }
  10.     }

  11.     printf("c = %d\n", c);
  12.     printf("End...\n");


    2) register关键字的变化

        a、register关键字请求“编译器”将局部变量存储于寄存器中(C语言中无法取得register变量的地址)

        b、在C++中依然支持register关键字
            1、C++编译器有自己的优化方式,不使用register也可能做优化

            2、C++中可以取得register变量的地址
        C++编译器发现程序中需要取得register变量的地址时,register对变量的声明变得无效。早期的C语言编译器不会对代码进行优化,因此register变量是一个很好的补充

例:


点击(此处)折叠或打开

  1. int main(int argc, char* argv[])
  2. {
  3.     register int c = 0;

  4.     printf("Begin...\n");

  5.     printf("&c = %08x\n", &c);

  6.     printf("End...\n");

  7.     printf("Press enter to continue...");
  8.     getchar();
  9.     return 0;
  10. }



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

C语言中多个同名的全局变量最终会被链接到全局数据区的同一个地址空间上,C++直接拒绝这种二义

性的做法。


点击(此处)折叠或打开

  1. int g_var;
  2. int g_var = 1;

  3. int main(int argc, char* argv[])
  4. {

  5.     printf("Begin...\n");

  6.     printf("g_var = %d\n", g_var);

  7.     printf("End...\n");

  8.     printf("Press enter to continue...");
  9.     getchar();
  10.     return 0;
  11. }



4>C++编译器对const常量的处理
例:

点击(此处)折叠或打开

  1. #include <stdio.h>

  2. int main(int argc, char *argv[])
  3. {
  4.     const int c = 0;
  5.     int* p = (int*)&c;
  6.     
  7.     printf("Begin...\n");
  8.     
  9.     *p = 5;
  10.     
  11.     printf("c = %d\n", c);
  12.     
  13.     printf("End...\n");
  14.     
  15.     printf("Press enter to continue ...");
  16.     getchar();
  17.     return 0;
  18. }



当碰见常量声明时在符号表中放入常量,编译过程中若发现使用常量则直接以符号表中的值替换,编

译过程中若发现对const使用了extern或者&操作符,则给对应的常量分配存储空间。虽然C++编译器

可能会为const常量分配空间,但不会使用去存储空间中的值

在C语言中,const变量是只读变量,有自己的存储空间;在C++中,const可能分配存储空间:1)当常量为全局,并且需要在其他文件中使用,2)当使用&操作符获取const常量的地址。

例:

点击(此处)折叠或打开

  1. #include <stdio.h>

  2. int main(int argc, char *argv[])
  3. {
  4.     const int a = 1;
  5.     const int b = 2;
  6.     int array[a + b] = {0};
  7.     int i = 0;
  8.     
  9.     for(i=0; i<(a+b); i++)
  10.     {
  11.         printf("array[%d] = %d\n", i, array[i]);
  12.     }
  13.     
  14.     printf("Press enter to continue ...");
  15.     getchar();
  16.     
  17.     return 0;
  18. }




C++中的const常量类似与宏定义 const int c = 5; #define c 5

但C++中的const常量在于宏定义不同:1)const常量是由编译器处理的 ,提供类型检查和作用域检查,2)宏定义由预处理器处理,单纯的文本替换。


点击(此处)折叠或打开

  1. #include <stdio.h>

  2. void f()
  3. {
  4.     #define a 3
  5.     const int b = 4;
  6. }

  7. void g()
  8. {
  9.     printf("a = %d\n", a);
  10.     //printf("b = %d\n", b);
  11. }

  12. int main(int argc, char *argv[])
  13. {
  14.     f();
  15.     g();
  16.     
  17.     printf("Press enter to continue ...");
  18.     getchar();
  19.     
  20.     return 0;
  21. }


5>struct类型的加强

    1)C 语言中的struct定义了一组变量的集合,C编译器并不认为这是一种新的类型。

    2)C++中的struct是一个新类型的定义声明
        struct Student
        {
            const char* name;
            int age;
        };

        Student s1;
        Student s2;
例:

点击(此处)折叠或打开

  1. #include <stdio.h>

  2. struct Student
  3. {
  4.     const char* name;
  5.     int age;
  6. };

  7. int main(int argc, char *argv[])
  8. {
  9.     Student s1 = {"Delphi", 30};
  10.     Student s2 = {"Tang", 30};
  11.     
  12.     printf("Press enter to continue ...");
  13.     getchar();
  14.     
  15.     return 0;
  16. }



6>C++对函数的加强

    C++中所有的变量和函数都必须有类型,C语言中的默认类型在C++中是不合法的。

例:

点击(此处)折叠或打开

  1. #include <stdio.h>

  2. f(i)
  3. {
  4.     printf("i = %d\n", i);
  5. }

  6. g()
  7. {
  8.     return 5;
  9. }

  10. int main(int argc, char *argv[])
  11. {
  12.     printf("Begin...\n");
  13.     
  14.     f(10);
  15.     
  16.     printf("g() = %d\n", g(1,2,3,4,5));
  17.     
  18.     printf("End...\n");
  19.     
  20.     printf("Press enter to continue ...");
  21.     getchar();
  22.     return 0;
  23. }



int f(); 与 int f(void)的区别:

在C语言中:int f():表示返回值为int,接收任意参数的函数;int f(void):表示返回值为int的无参数函数。

在C++中: int f():和int f(void)具有相同的意义,都表示返回值为int的无参数函数。

总结:C++以C语言为基础进行了加强,C++更强调实用性,可以在任意的地方声明变量,C++中的

register只是一个向后兼容的作用,C++编译器能够进行更好的变量优化;C++中的const是一个真正

意义上的常量,而不是只读变量;C++更加强调类型,任意的程序元素都必须显示指明类型。


阅读(2227) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~