C和C++之间的不同

(注,本文是翻译的http://www.cprogramming.com/ 上的文章 Where C and C++ Differ

 

C++基于C,也保留了C的大部分特性。但是在源码级上有些地方是与C不兼容的。

C程序员使用C++时的陷阱

从 void* 的隐式分配

不能从 void* 隐式地分配到其他任何类型。例如,下面的代码在C中是非常有效的。
    int *X = malloc(sizeof(int) * 10);
但是却不能在C++中编译。

按照Bjarne Stroustrup他自己的解释,这不是类型安全的。

考虑如下的代码:
    int an_int;
    void *void_pointer = &an_int;
    double *double_ptr = void_pointer;
    *double_ptr = 5;

当你给*double_ptr分配值5,其向内存中写入8个字节,但是整形变量an_int仅为4个字节。
程序应该注意这样的强制转换。

释放数组:new[] 和 delete[]

在C中,只有一种主要的内存分配函数:malloc 。你可以使用它来分配单一元素和数组:
    int *X = malloc(sizeof(int);
    int *x_array = malloc(sizeof(int) * 10);

你总是用相同的方法释放内存:
    free(X);
    free(x_array);


而在C++中,为数组的内存分配是不同于单一对象的,要使用 new[] 操作符,你还必须调用
 delete[]来释放 new[] 分配的内存:
    int *X = new int;
    int *x_array = new int[10];
    delete X;
    delete[] x_array;

必须在使用函数前声明

虽然大部分的C代码都遵循这个约定,但是在C++中,使用函数前声明其是必须的。下面的代码
在C中是有效的,但是在C++中却无效:
    #include <stdio.h>
    int main()
    {
        foo();
        return 0;
    }
    int foo()
    {
        printf("Hello world/n");
    }

C++程序员使用C时的陷阱

 

结构体和枚举类型

声明一个结构体时,你必须在结构体类型的名字前加上 struct 关键字:在C++中,你可以这样:
    struct a_struct
    {
        int x;
    };
    a_struct struct_instance;

声明一个新的 a_struct 实例 struct_instance 。而在C中,声明 struct_intance 时,
我们必须包含 struct 关键字:
    struct a_struct struct_instance;

实际上,声明枚举类型时也是一样的:在C中,必须包含关键字 enum 。而大部分的C程序员
使用 typedefs 解决这个问题:
    typedef struct struct_name
    {
        /* variables */
    } struct_name_t;

现在,你可以这样声明:
    struct_name_t struct_name_t_instance;

但是,对于C++程序员有另一个陷阱:你必须仍然使用"struct struct_name"语法来声明一个
指向该结构体的结构体成员指针:
    typedef sturct struct_name
    {
        struct struct_name instance;
        struct_name_t instance2;    /* 无效的,typedef 还没定义 */
    } struct_name_t;

C++用于很大的库

C++用于比C更大的库,当不使用C时,一些是在C++中自动连接的。例如,如果你习惯使用g++
来编译大量的数学运算,那么当你使用gcc来编译C时,你需要显示地包含数学库:
    %g++ foo.cc
    or
    %gcc foo.c -lm

没有布尔类型

C 是没有提供布尔类型的,你可以使用枚举类模拟:
    typedef enum {FALSE, TRUE} bool;

主函数没有自动地提供返回 0

在C++中,在main函数的后面,你可以不需要‘return 0’语句,它将自动提供:
    int main()
    {
        printf("Hello, world/n");
    }

但是在C中,你必须手动地添加它:
    int main()
    {
        printf("Hello, world/n");
        return 0;
    }

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值