C++要点摘录(一)C到C++的升级

来源:互联网 发布:理财软件下载 编辑:程序博客网 时间:2024/05/29 04:29

一.C到C++的升级    

1.  C++支持所有的变量都可以在使用时再定义,c语言中的变量都必须在作用域开始的位置定义(c99标准已经支持)

注: c语言支持作用域首部定义,作用域指{}区域,不一定是函数首部。例如:for循环中,在for的作用域中定义的变量,在作用域结束的时候就释放了

#include<stdio.h>void main(){int i,c,j;    for(i=0; i<10; i++)    {        int k=0;        for(j=0; j<10; j++)        {            c += i * j;        }printf("%d\n",k);k++;    }k++;}

会报错

2.register关键字的变化

               C:    C语言中无法取得register变量的地址

               C++:C++编译器依然支持register关键字,但是C++编译器有自己的优化方式,不使用register也可能做优化

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

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


3.C++不允许定义多个同名全局变量

       在C语言中,重复定义多个同名的全局变量是合法的。这些同名的全局变量最终会被连接到全局数据区的同一个地址空间

       在C++中,不允许定义多个同名的全局变量

     

4. C++编译器对const常量的处理

         1. 当遇见常量声明时在符号表中放入常量

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

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

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

        区别:C------const变量是只读变量,有自己的存储空间

                  C++------可能分配存储空间(为了兼容C语言,只是能取地址)的情况:当const常量为全局,并且需要在其他文件中使用;当使用&操作符取const常量地址

         4.c++中的const常量类似于宏定义  const  int c =5;约等于#deine  c 5

            c++与宏定义不同:1.const常量是由编译器处理的,提供类型检查和作用域检查;2.宏定义由预处理器处理,单纯的文本替换

      在C语言中将const指针赋值给普通指针会有警告,但是在C++中会报错,在C++中非const指针不可以接受const指针,是防止你通过非const指针去改变他所指向的值(如果要赋值,请强制转换)


5.struct类型的加强

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

     C++中的struct是一个新类型的定义声明,下面的代码c语言报错,c++能够编译通过,因为c语言编译器不认识Student类型,要用struct Student来标识

   

#include <stdio.h>struct Student{    const char* name;    int age;};int main(int argc, char *argv[]){    Student s1 = {"Delphi", 30};//c语言应改为struct Student    Student s2 = {"Tang", 30};        printf("Press enter to continue ...");    getchar();        return 0;}

 C++中的struct扩充了C的struct功能,在C++中struct≈class,能够包含构造函数和成员函数,C++中struct和class的区别在于class默认成员属性是private,struct中默认成员属性是public;class可以用于表示模板类,struct不行

C中的struct只是复杂数据类型集合,调用函数需要使用函数指针来实现


6.类型的加强

  c++中所有的变量和函数都必须有类型,必须写明,没有默认一说。

  c语言中的默认类型在c++中是不合法的

  

#include <stdio.h>f(i){    printf("i = %d\n", i);}g(){    return 5;}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语言编译器正常编译运行,打印i=10, g()=5,因为c语言函数的默认返回值是int,参数默认类型也是int

f(i) ===>int f(int i)/////g()====>int g(),g()可以接受不限制的参数g(1,2,3……)都是c的缺陷,所以不接收参数要写明void,int g(void)
c++编译器报错,没有返回值类型,c下面的函数很随意


int f()和int  f(void)的区别

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

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


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

               C++中register只是一个向后兼容的作用,C++编译器自己能够进行更好的变量优化,而不需要指明

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

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

7.C++中的布尔类型

   C++在C语言的基本类型之上增加了bool 

   C++中的bool可取的值只有true和false

    理论上bool只占用一个字节,如果多个bool变量定义在一起,可能会各占一个bit,这取决于编译器的实现

    true代表真值,编译器内部用1来表示;false代表非真值,编译器内部用0来表示

bool类型只有true(非0)和false(0) 两个值:C++编译器会在赋值时将非0值转换为true(1),0值转换为false(0)

#include <stdio.h>int main(int argc, char *argv[]){    int a;    bool b = true;        printf("b = %d, sizeof(b) = %d\n", b, sizeof(b));        b = 3;    a = b;        printf("a = %d, b = %d\n", a, b);        b = -5;    a = b;        printf("a = %d, b = %d\n", a, b);        a = 10;    b = a;        printf("a = %d, b = %d\n", a, b);        b = 0;        printf("b = %d\n", b);        printf("Press enter to continue ...");    getchar();    return 0;}

非零值赋值给bool变量,会转换为1;将bool型变量赋值给其他变量,只能获得1或0两种结果

8.三目运算符的升级

  C语言中的三目运算符返回的是变量值,不能作为左值使用

  C++中的三目运算符可直接返回变量本身,因此可能出现在程序的任意地方

     注意: 三目运算符可能返回的值中如果有一个是常量值,则不能作为左值使用

下面程序在C++编译通过,C编译器编译不过:
#include <stdio.h>int main(int argc, char *argv[]){    int a = 1;    int b = 2;        (a < b ? a : b) = 3;        printf("a = %d, b = %d\n", a, b);        printf("Press enter to continue ...");    getchar();    return 0;}

打印a = 3,b = 2

原创粉丝点击