C和C++之间有什么区别

Din*_*nah 15 c c++

我知道C++有对象的概念,但C没有.我也知道,几乎所有人都知道C适合K&R,但C++库要复杂得多.但是必须有其他重大差异.

C和C++之间的主要区别是什么?

Bri*_*ndy 26

C++语言说它们是相同的:

int C = 0;
assert(C++ == C);
Run Code Online (Sandbox Code Playgroud)

  • 大声笑但事实并非如此.您的相等测试的结果是未定义的... :)我想知道关于这两种语言的说法.:p (9认同)
  • @jalf:不仅仅是结果;*行为*未定义。 (3认同)
  • gcc和vc ++都说这是真的 (2认同)

And*_*ula 25

在这里查看Stroustrup的FAQ ,具体来说:

C和C++有什么区别?

C++是C的直接后代,它几乎将所有C保留为子集.C++提供比C更强的类型检查,并直接支持比C更广泛的编程风格.C++是"更好的C",因为它支持使用C完成的编程风格,具有更好的类型检查和更多的符号支持(没有损失)效率).同样,ANSI C是比K&R C更好的C.此外,C++支持数据抽象,面向对象编程和泛型编程(参见C++编程语言(第3版)";附录B讨论兼容性问题可用下载).


bdd*_*bdd 16

我想你回答了自己的问题:课程

它是一个完全不同的设计范例.我认为混乱是因为许多人开发的C++程序基本上都是C程序,甚至没有意识到.

根据其创建者的话,Stroustrup允许:

编辑:添加了一些其他有趣的东西


jal*_*alf 7

简而言之,C希望成为一种"便携式汇编语言".它保持简单,让你做几乎直接映射到底层硬件的东西,并没有提供很多高级抽象(你有功能和......就是这样)

C++试图成为一切.高级语言,低级语言,面向对象语言,多范式语言,系统编程语言,嵌入式编程语言和应用程序开发语言.

除了一些共享语法之外,这两种语言并没有太多共同之处.AC程序可能只编译为C++,只有很小的改动,但它与为该语言编写的"适当的"C++代码没有任何共同之处.


Eva*_*ran 7

这是一个显示c和c ++之间"不兼容"的网站:

http://david.tribble.com/text/cdiffs.htm#C++-vs-C

实际上有很多领域c和c ++分歧(除了类,模板,异常等).

至于主要差异,这里列出了一个很好的清单:

  • 匿名工会
  • 构造函数和析构函数
  • 异常和try/catch块
  • 外部功能联系(例如,外部功能"C")
  • 函数重载
  • 成员职能
  • 命名空间
  • new和delete运算符和函数
  • 运算符重载
  • 参考类型
  • 标准模板库(STL)
  • 模板类
  • 模板功能


Che*_*Alf 6

C++主要是C的一个扩展。C++最初被称为“C with classes ”,突出了主要的原始语言扩展。那时已经支持函数的重载。从那时起,C++ 获得了异常、分层命名空间模板形式的泛型编程以及最后的多线程支持。由于C ++ 11有也是一些最小核心语言支持垃圾回收使用例如贝姆垃圾收集器. 较小的扩展包括引用类型、尾随函数返回类型语法、可以覆盖的内存分配和释放机制、运行时类型信息等。

C 和 C++ 之间的差异,即 C 和 C++ 的“C 子集”之间的差异,在 C++11 标准的标题为“兼容性”的附录 C 中进行了总结,该附录大约有 20 页,其中 C1 部分属于C 兼容性大约是 10 页。

在 C++98 和 C++03 中也是附录 C,在新的 C++14 标准中也是附录 C。


截至该标准的 C++11 附录 C 列出了 C 和 C++ 之间的以下不兼容性:

§C1.1 词汇约定

新关键字(第 2.12 节)

该段落仅参考 C++11 §2.12。以下列表是根据该表和 C99 中的相应表生成的。

    C99                  C++11

    _布尔               
    _复杂的            
    _假想          
                        对齐             
                        对齐             
                        汇编                 
    自动 自动                
                        布尔值                
    休息 休息               
    案例案例                
                        抓住               
    字符 字符                
                        char16_t            
                        char32_t            
                        班级               
    常量常量               
                        const_cast          
                        常量表达式           
    继续 继续            
                        声明类型            
    默认 默认             
                        删除              
    渡渡鸟                  
    双双              
                        dynamic_cast        
    别的 别的                
    枚举 枚举                
                        明确的            
                        出口              
    外部外部              
                        错误的               
    浮动浮动               
    对于为                 
                        朋友              
    转到转到                
    如果如果                  
    内联              
    整数                 
    长长的                
                        可变的             
                        命名空间           
                        新的                 
                        没有例外            
                        空指针             
                        操作员            
                        私人的             
                        受保护           
                        民众              
    注册 注册            
                        reinterpret_cast    
    严格            
    返回 返回              
    短 短               
    签字 签字              
    大小大小              
    静态 静态              
                        静态断言       
                        static_cast         
    结构体              
    开关开关              
                        模板            
                        这个                
                        线程本地        
                        扔               
                        真的                
                        尝试                 
    类型定义类型定义             
                        类型标识              
                        类型名称            
    工会 工会               
    未签名 未签名            
                        使用               
                        虚拟的             
    空虚                
    挥发性 挥发性            
                        wchar_t             
    一会儿一会儿               

字符文字类型从 更改intchar (第 2.14.3 节)

制作的字符串文字const(第 2.14.5 节)

§C1.2 基本概念

C++ 没有“暂定定义”(第 3.1 节)。

Astruct是 C ++ 中的范围,而不是 C (第 3.3 节)。

显式声明为 const 而未显式声明的文件范围的名称extern具有内部链接,而在 C 中它将具有外部链接($3.5)。

main 不能递归调用,也不能获取其地址(第 3.6 节)。

C 在几个地方允许“兼容类型”,C++ 不允许(第 3.9 节)。

§C1.3 标准转换。

转换void*为指向对象的类型需要强制转换(第 4.10 节)。

只有指向非易失性const和非易失性对象的指针可以隐式转换为void*(第 4.10 节)。

§C1.4 表达式。

不允许隐式声明函数(第 5.2.2 节)。

类型必须在声明中声明,而不是在表达式中(第 5.3.3 节、第 5.4 节)。

条件表达式、赋值表达式或逗号表达式的结果可能是左值(第 5.16 节、第 5.17 节、第 5.18 节)。

§C1.5 声明。

现在跳过带有显式或隐式初始化程序的声明是无效的(除非跨未输入的整个块)(第 6.4.2 节,第 6.6.4 节)

现在从声明返回值而不实际返回值的函数返回(显式或隐式)是无效的(第 6.6.3 节)。

§C1.6 声明。

在 C++ 中,staticextern说明符只能应用于对象或函数的名称。在 C++(第 7.1.1 节)中将这些说明符与类型声明一起使用是非法的。

C++typedef名称必须与在同一范围内声明的任何类类型名称不同(除非typedef是同名类名称的同义词)(第 7.1.3 节)。

const 对象必须在 C++ 中初始化,但可以在 C 中保持未初始化(第 7.1.6 节)。

intC++ 中没有隐式(第 7.1.6 节)。

该关键字auto不能用作存储类说明符(第 7.1.6.4 节)。

枚举类型的 C++ 对象只能分配相同枚举类型的值(第 7.2 节)。

在 C++ 中,枚举器的类型是它的枚举(第 7.2 节)。

§C1.7 声明符。

在 C++ 中,使用空参数列表声明的函数不接受任何参数 ($8.3.5)。

在 C++ 中,不能在返回类型或参数类型中定义类型(第 8.3.5 节、第 5.3.3 节)。

在 C++ 中,函数定义的语法不包括“旧式”C 函数(第 8.4 节)。

在 C++ 中,当用字符串初始化字符数组时,字符串中的字符数(包括终止符'\0')不得超过数组中的元素数(第 8.5.2 节)。

§C1.8 类。

在 C++ 中,类声明将类名引入到声明它的作用域中,并在封闭作用域中隐藏该名称的任何对象、函数或其他声明(第 9.1 节、第 7.1.3 节)。

在 C++ 中,嵌套类的名称是其封闭类的本地名称(第 9.7 节)。

在 C++ 中,typedef名称在类定义中使用后不得在类定义中重新声明(第 9.9 节)。

§C1.9 特殊成员函数。

隐式声明的复制构造函数和隐式声明的复制赋值运算符不能复制volatile左值(第 12.8 节)。

§C1.10 预处理指令。

是否__STDC__已定义,如果已定义,其值是什么,都是实现定义的(第 16.8 节)。


为了简化比较关键字表的重新生成,并建立对给定表的信心,以下是用于生成它的 C++ 程序:

#include <algorithm>
#include <iostream>
#include <iomanip>
#include <fstream>
#include <vector>
#include <string>
using namespace std;

#define ITEMS_OF( c )   c.begin(), c.end()

enum class Language { c, cpp };

auto compare( Language const a, Language const b )
    -> int
{ return int( a ) - int( b ); }

struct Keyword
{
    string      word;
    Language    language;

    friend
    auto operator<( Keyword const& a, Keyword const& b )
        -> bool
    {
        if( int const r = a.word.compare( b.word ) ) { return (r < 0); }
        return (compare( a.language, b.language ) < 0);
    }
};

void add_words_from(
    string const& filename, Language const language, vector< Keyword >& words
    )
{
    ifstream            f( filename );
    string              word;

    while( getline( f, word ) )
    {
        words.push_back( Keyword{word, language} );
    }
}

auto main() -> int
{
    vector< Keyword >   words;
    add_words_from( "kwc.txt", Language::c, words );
    add_words_from( "kwcpp.txt", Language::cpp, words );
    sort( ITEMS_OF( words ) );

    int const w = 20;

    int previous_column = -1;
    string previous_word = "";
    cout << left;
    for( Keyword const& kw : words )
    {
        int const column = (int) kw.language;
        int const column_advance = column - (previous_column + 1);
        if( column_advance < 0 || previous_word != kw.word )
        {
            cout << endl;
            if( column > 0 ) { cout << setw( w*column ) << ""; }
        }
        else
        {
            cout << setw( w*column_advance ) << "";
        }
        cout << setw( w ) << kw.word;
        previous_column = column; previous_word = kw.word;
    }
    cout << endl;
}
Run Code Online (Sandbox Code Playgroud)