C++与C的主要差异

简单性和与C的高度兼容性是C++语言的重要设计原则,它继续维持C作为其一个子集,在C++语言中定义新的类型是其最基本的程序设计活动,并且极力避免了那些即使不用也会带来时间或空间额外开销的特征,支持利用传统的编译和运行时环境,具有类型检查和数据隐藏特征。C++特别强调程序的结构,强调模块化、强类型接口和灵活性,支持大型程序的开发。

任何一种程序设计语言都要服务于两个目的,一是提供一种需要描述所执行动作的载体,而是为程序员提供描述问题的概念。前者要求这个程序设计语言尽可能接近机器,后者要求该程序设计语言尽可能接近要解决的问题。与C语言的兼容性保证了前者的要求,类的引入使C++语言达到后者的要求。

C++C的主要差别

C++C的差异的根源主要来源于C++提供的类型检查和支持面向对象和模板等程序设计模式的需要,差异主要有如下几点:

  • C中字符常量和枚举符的大小都是sizeof(int),而在C++里,对一个字符常量使用sizeof的结果等于sizeof(char),而且sizeof应用于枚举符的大小会根据随着枚举类型的不同而不同,因为C++实现会为枚举选择合适的类型,在g++实现中每个枚举都占sizeof(int)个字节,没有根据其值范围选择不同的int类型。
/***************************************
 * sizeof_char_enum.c                  *
 *                                     *
 * C语言中的字符常量和枚举符大小是     *
 * sizeof(int)                         *
 ***************************************/

#include <stdio.h>

enum EnumType
{
  Test1,
  Test2
};

int main()
{
  printf("int的字节数为%u\n", (unsigned)sizeof(int));
  printf("字符常量的字节数为%u\n", (unsigned)sizeof('c'));
  printf("枚举类型的字节数为%u\n", (unsigned)sizeof(enum EnumType));

  return 0;
}
/***************************************
 * sizeof_char_enum.c.pp               *
 *                                     *
 * C++语言中的字符常量是sizeof(int),枚*
 * 举的字节数根据实际情况而定          *
 *                                     *
 ***************************************/

#include <iostream>

enum EnumType
{
  Test1 = 0,
  Test2 = 1
};

enum EnumType2
{
  Test12,
  Test22 = 512
};

int main()
{
  std::cout<<"int的字节数为"<<sizeof(int)<<"\n";
  std::cout<<"short int的字节数为"<<sizeof(short)<<"\n";
  std::cout<<"字符常量的字节数为"<<sizeof('c')<<"\n";
  std::cout<<"枚举类型EnumType的字节数为"<<sizeof(EnumType)<<"\n";
  std::cout<<"枚举类型EnumType2的字节数为"<<sizeof(EnumType2)<<"\n";

  return 0;
}

枚举和字符常量字节

  • C++提供了单行注释//C89标准中没有,C99标准添加了单行注释,但许多C实现都支持了单行注释,例如gcc
/*************************************
 * single_annotation.c               *
 *                                   *
 * C语言中的单行注释//               *
 ************************************/

#include <stdio.h>

int main()
{
  /*单行注释*/
  int a = 8;

  //单行注释
  printf("a = %d\n", a);

  return 0;
}

单行注释

  • C++程序中在内层作用域中声明的结构名称将屏蔽外层作用域的对象、函数、枚举或者类型的名称。
/***************************************
 * inner_structure.c                   *
 *                                     *
 * 内层作用域中的结构体                *
 ***************************************/

#include <stdio.h>

int x[99];

int main()
{
  struct x {int a;};
  printf("x的大小为%u\n", (unsigned)sizeof(x));
  return 0;
}
/***************************************
 * inner_structure.cpp                   *
 *                                     *
 * 内层作用域中的结构体                *
 ***************************************/

#include <iostream>

int x[99];

int main()
{
  struct x {int a;};
  std::cout<<"x的大小为"<< (unsigned)sizeof(x)<<"\n";
  return 0;
}

内部定义结构体
- C中运行在没有预先声明的情况下调用大部分函数(这会出现问题,产生莫名其妙的错误,难以调试,使用函数原型),而C++不允许。
- C中可以用整数为枚举类型赋值,而C++不允许。
- C++提供了比C更多的关键字,如表1所示。C中,C++的某些关键字被作为宏定义在头文件里
- C++中,同一个作用域内,不能有一个类名和typedef定义的类名相同。
- C中任意指针类型的变量可以自动转换为void *C++不能那么做。C允许跳过void *类型的初始化,而C++不允许。

/**************************************
 * void_pointer.c                     *
 *                                    *
 * C语言中的void型指针                *
 **************************************/

#include <stdio.h>

int main()
{
  int a = 10;
  void *p = &a;
  int *p1 = p;
  printf("*p1 = %d\n", *p1);

  return 0;
}
/**************************************
 * void_pointer.cpp                   *
 *                                    *
 * C++语言中的void型指针              *
 **************************************/

#include <iostream>

int main()
{
  int a = 10;
  void *p = &a;
  int *p1 = p;
  std::cout<<"*p1 = "<< *p1<<std::endl;
  return 0;
}

void指针
- C中嵌套结构的名字和嵌套于其中的结构在同一个作用域。

/**************************************
 * struct_closure.c                   *
 *                                    *
 * C语言中嵌套的作用域定义            *
 **************************************/

#include <stdio.h>

int main()
{
  struct S
  {
    struct T{int x,y;} a;
  };

  struct T t = {10,20};

  printf("t.x = %d, t.y = %d\n", t.x, t.y);

  return 0;
}
/**************************************
 * struct_closure.cpp                 *
 *                                    *
 * C语言中嵌套的作用域定义            *
 **************************************/

#include <iostream>

int main()
{
  struct S
  {
    struct T{int x,y;} a;
  };

  struct T t = {10,20};

  std::cout<<"t.x = "<<t.x<<","<<"t.y = "<<t.y<<std::endl;
  return 0;
}

struct作用域
- C使用static指明函数或对象是某一个文件的局部的东西,C++不使用static,而是用匿名名字空间替代。
- C隐式地将字符串文字量转换为char *,C++将字符串常量类型设置为const char*,不允许隐式转换。
- C++支持使用static_castreinterpret_castconst_cast取代C风格的类型转换。
- C++支持对static存储中对象的非常量初始化
-C++支持在for语句初始化表达式和条件中的声明,C99标准也支持
-C+支持结构名前无需前缀struct
- C++支持类型安全的链接
- C++支持用newdelete管理自由存储
- C++支持布尔类型bool
- C++支持函数重载
- C++将变量声明作为一个语句
- C++支持为函数提供默认参数
- C++支持类、成员函数、成员类、构造和析构函数、派生类、虚函数和抽象类、共用/保护/私有访问控制、友元、执行成员的指针、static成员、mutable成员、运算符重载和引用等用以用户定义类型
-C++使用模板、内联函数、默认参数、函数重载、名字空间、显示作用域限定、异常处理和运行时类型识别等组织程序。

表1 C++新增的关键字

andand_eqasmbitandbitorbool
catchclasscomplconst_castdeletedynamic_cast
explicitexportfalsefriendinlinemutable
namespacenewnotnot_eqoperatoror
or_eqprivateprotectedpublicreinterpret_caststatic_cast
templatethisthrowtruetrytypeid
typenameusingvirtualwchar_txorxor_eq

_cplusplus可以用以确定是C还是C++编译器在处理当前程序。

参考文献

  1. Bjarne Stroustrup著,裘宗燕译. C++程序设计语言(特别版).机械工业出版社 2009.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值