C++--第1课 - C到C++的升级

第1课 - C到C++的升级

1. C与C++的关系

(1)      C++继承了所有的C特性。

(2)      C++在C的基础上提供了更多的语法和特性。

(3)      C++的设计目标是运行效率和开发效率的统一。

l  C++以C语言为基础,面向对象支持,类型加强,函数加强,异常处理。

2. C++对C的加强

(1)C语言中的变量必须在作用域开始的位置进行定义,但是C++可以在需要的时候进行定义。

#include <stdio.h>

int main(int argc, char *argv[])

{

    int c = 0;   

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

    for(int i=0; i<10; i++)

    {

        for(int j=0; j<10; j++)

        {

            c += i * j;

        }

    }

    printf("c = %d\n", c);   

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

    printf("Press enter to continue ...");

    getchar();

    return 0;

}

(2)resgister关键字的变化

register关键字请求“编译器”将局部变量存储于寄存器中,C语言中无法获得register变量地址。

在C++中依然支持register关键字。C++编译器有自己的优化方式,不使用register也可能做优化,C++中可以取得register变量的地址。C++编译器发现程序中需要取register变量的地址时,register对变量的声明变得无效。

#include <stdio.h>

int main(int argc, char *argv[])

{

    register int c = 0;   

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

    printf("&c = %08X\n", &c); 

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

    printf("Press enter to continue ...");

    getchar();

    return 0;

}

(3)在C语言中,重复定义多个同名的全局变量是合法的,但是在C++中,是不允许多个同名的全局变量。C语言中的多个同名的全局变量最终会被链接到全局数据区的同一个地址空间上。

#include <stdio.h>

int g_var;

int g_var = 1;

int main(int argc, char *argv[])

{

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

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

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

    printf("Press enter to continue ...");

    getchar();

    return 0;

}

运行会出错。

(4)C++对const常量的处理

当碰见常量声明时在符号表中放入常量。

编译过程中若发现使用常量则直接以符号表中的值替换。

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

注意:C++编译器虽然可能为const常量分配空间,但是不会使用期存储空间中的值。

#include <stdio.h>

int main(int argc, char *argv[])

{

    const int c = 0;

    int* p = (int*)&c;  

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

    *p = 5;   

    printf("c = %d\n", c);  

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

    printf("Press enter to continue ...");

    getchar();

    return 0;

}

这段程序在C编译器中的“c变量”运行结果是5,但是在C++编译器中的运行结果是0。

C语言中的const变量是只读变量,有自己的存储空间。

C++中的const常量可能分配存储空间:当它是全局变量,并且需要在其他文件中使用的时候;当它用&操作符取const常量的地址的时候

#include <stdio.h>

int main(int argc, char *argv[])

{

    const int a = 1;

    const int b = 2;

    int array[a + b] = {0,1,2};

    int i = 0; 

    for(i=0; i<(a+b); i++)

    {

        printf("array[%d] = %d\n", i, array[i]);

    }   

    printf("Press enter to continue ...");

    getchar();  

    return 0;

}
运行结果:

array[0] = 0;

array[1] = 1;

array[2] = 2;

C++中的const常量类似于宏定义,const int c = 5; 近似等于#define c 5

但是const常量是由编译器处理的,提供类型和作用域检查。宏定义有预处理器处理,单纯的文本替换。

#include <stdio.h>

void f()

{

    #define a 3

    const int b = 4;

}

void g()

{

    printf("a = %d\n", a);

    printf("b = %d\n", b);

}

int main(int argc, char *argv[])

{

    f();

    g();

    printf("Press enter to continue ...");

    getchar();

    return 0;

}

我们当运行这个程序的时候,a变量在g()中可以使用,但是b不可以。我们写程序的时候,要是这样写,目的就是将a和b的作用域限制在f()中。我们为了达到我们预期的效果,我们可以按如下的方法修改f()函数。

void f()

{

    #define a 3

    const int b = 4;

#undef a

}

这样既可。

(5)struct类型加强

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

#include <stdio.h>

struct Student

{

    const char* name;

    int age;

};

int main(int argc, char *argv[])

{

    Student s1 = {"Delphi", 30};

    Student s2 = {"Tang", 30};  

    printf("Press enter to continue ...");

    getchar();  

    return 0;

}

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

#include <stdio.h>

f(i)

{

    printf("i = %d\n", i);

}

g()

{

    return 5;

}

//注:g()和g(void)在C语言中是不一样的,但是在C++中却是一样的。

int main(int argc, char *argv[])

{

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

    f(10); 

    printf("g() = %d\n", g(1,2,3,4,5));   

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

    printf("Press enter to continue ...");

    getchar();

    return 0;

}

在C语言中:

int f()表示返回值是int,接受任意参数的函数。

int f(void),表示返回值为int的无参数函数。

在C++中:

int f()和int f(void)具有相同额意义,都表示返回值为int的无参数型。

小结:

(1)      C++在C语言的基础上进行了加强

(2)      C++更强调实用性,可以在任意的地方声明变量。

(3)      C++中的register只是一个向后兼容的作用,C++编译器能够进行更好的变量优化。

(4)      C++中的const是一个真正意义上的常量,而不只是只读变量。

(5)      C++更加强调类型,任意的程序元素都必须显示指明类型。

猜你喜欢

转载自www.cnblogs.com/free-1122/p/11336144.html