c++对C语言的扩展(一)

来源:互联网 发布:6s4g网络突然上不了网 编辑:程序博客网 时间:2024/05/16 14:50

(一) C++对C的加强:
1)命名空间:
为什么要引入命名空间这个概念:一个中大型软件往往由多名程序员共同开发,会使用大量的变量和函数,不可避免地会出现变量或函数的命名冲突。当所有人的代码都测试通过,没有问题时,将它们结合到一起就有可能会出现命名冲突。
 
例如小李和小韩都参与了一个文件管理系统的开发,它们都定义了一个全局变量 fp,用来指明当前打开的文件,将他们的代码整合在一起编译时,很明显编译器会提示 fp 重复定义(Redefinition)错误。
 
为了解决合作开发时的命名冲突问题,C++ 引入了命名空间(Namespace)的概念。
命名空间将全局作用域分成不同的部分
不同命名空间中的标识符可以同名而不会发生冲突
命名空间可以相互嵌套
全局作用域也叫默认命名空间
怎样使用命名空间:
1°命名空间的定义:
 /**
namespace 是C++中的关键字,用来定义一个命名空间,语法格式为:
namespace name
{
    变量
    函数
    类
}
name是命名空间的名字,它里面可以包含变量、函数、类、typedef、#define 等,最后由{ }包围 
**/
// 定义一个命名空间,名字叫NameSpaceA
namespace NameSpaceA
{
    int a = 0;
}
 
// 命名空间的定义可以嵌套
namespace NameSpaceB
{
    int a = 1;
 
    namespace NameSpaceC
    {
        struct Teacher
        {
            char name[10];
            int age;
        };
    }
}
2°命名空间的使用:
1°使用域解析符(::):// ::是一个新符号,称为域解析操作符,在C++中用来指明要使用的命名空间。
NameSpaceA::a = 10;   // 使用命名空间 NameSpaceA中的变量a
NameSpaceB::a = 20;   // 使用命名空间 NameSpaceB中的变量a
printf ("%d, %d\n", NameSpaceA::a, NameSpaceB::a);
 
使用命名空间B中的命名空间C中的结构体 Teacher
NameSpaceB::NameSpaceC::Teacher t2 = {"xiaoming", 20};


3°使用using声明:在这里用using声明了 NameSpaceA::a, 它的意思是在声明以后的程序中如果出现
未指明命名空间的a,就使用NameSpaceA命名空间里的a
如果要使用NameSpaceB命名空间中的a,则仍需要使用这样的方式 NameSpaceB::a;
using NameSpaceA::a;
a = 20;                // 使用命名空间NameSpaceA中的a
NameSpaceB::a = 30;    // 使用命名空间NameSpaceB中的a
using 声明不仅可以针对命名空间中的变量或者函数,还可以对整个命名空间进行声明
这样的方式声明命名空间以后,在后面使用未指定具体命名空间的变量或者函数产生命名冲突的时候
默认使用 NameSpaceB中的变量和函数
using namespace NameSpaceB;
a = 10;
printf ("%d\n", NameSpaceB::a);


4°c++标准库和std命名空间: C++ 引入了命名空间的概念,计划重新编写库,将类、函数、宏等都统一纳入一个命名空间,这个命名空间的名字就是std。std 是 standard 的缩写,意思是“标准命名空间”,可以发现,对于不带.h的头文件,所有的符号都位于命名空间 std 中,使用时需要声明命名空间 std;对于带.h的头文件,没有使用任何命名空间,所有符号都位于全局作用域。这也是 C++ 标准所规定的。


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


3)register关键字的变化:register关键字请求“编译器”将局部变量存储于寄存器中 C语言中无法取得register变量地址
  
在C++中依然支持register关键字:
    1、C++编译器有自己的优化方式,不使用register也可能做优化
    2、C++中可以取得register变量的地址
C++编译器发现程序中需要取register变量的地址时,register对变量的声明变得无效。


4)变量检测加强:
    1、在C语言中重复定义多个全局变量是合法的 这些同名的全局变量最终都会被链接全局数据区的同一个地址空间上
    2、在C++中不允许定义多个同名的全局变量


5)struct的加强:  
   1、C语言中 struct 定义了一组数据的集合,而不是一种新的数据类型 所以在定义变量的时候需要在前面加上 struct 关键字进行修饰
   2、 C++中 struct 定义了一种新的数据类型,可以直接用来定义变量


6)C++中所有变量和函数都必须要有类型:
   1、在C语言中
      int f(    );表示返回值为int,接受任意参数的函数
      int f(void);表示返回值为int的无参函数
 
   2、在C++中
      int f(  );和int f(void)具有相同的意义,都表示返回值为int的无参函数
 
C++更加强调类型,任意的程序元素都必须显示指明类型


7)新增bool类型关键字: 
    1、  bool类型只有true(非0)和false(0)两个值
    2、 C++编译器会在赋值时将非0值转换为true,0值转换为false


8)三目运算符的增强:
   1、C语言返回变量的值 C++语言是返回变量本身
    C语言中的三目运算符返回的是变量值,不能作为左值使用
    C++中的三目运算符可直接返回变量本身,因此可以出现在程序的任何地方
 
   2、注意:三目运算符可能返回的值中如果有一个是常量值,则不能作为左值使用
    (a < b ? 1 : b )= 30;