C和C ++有什么区别

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

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

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

C和C ++有什么区别?

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

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

int C = 0; assert(C++ == C); 

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

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

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

  • 数据抽象
  • 面向对象的编程
  • 通用编程。

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

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

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

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

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

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

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

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

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

C ++主要是C的扩展。最初C ++被称为“C with classes ”,突出了主要的原始语言扩展。 当时已经支持过载function。 从那以后,C ++已经获得了exception ,分层命名空间模板forms的通用编程,以及最后的multithreading支持。 从C ++ 11开始,还有一些使用例如Boehm垃圾收集器进行垃圾收集的最小核心语言支持。 较小的扩展包括引用类型,尾随函数返回类型语法,可以重写的内存分配和释放机制,运行时类型信息等。

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

     _Bool               
     _复杂            
     _假想          
                         alignas             
                         alignof             
                         ASM                 
    汽车自动                
                        布尔                
    rest时间               
    案例                
                        抓住               
     char char                
                         char16_t            
                         char32_t            
                        类               
     const const               
                         const_cast会          
                         constexpr           
    继续            
                         decltype            
    默认默认值             
                        删除              
    渡渡鸟                  
    双倍              
                        的dynamic_cast        
    别的                
     enum enum                
                        明确的            
                        出口              
    外部的外部              
                        假               
    浮漂               
    因为                 
                        朋友              
    转到转到                
    如果如果                  
    内联内联              
     int int                 
    很久很久                
                        易变的             
                        命名空间           
                        新                 
                         noexcept            
                         nullptr             
                        操作者            
                        私人的             
                        保护           
                        上市              
    注册寄存器            
                         reinterpret_cast的    
    限制            
    回报              
    短暂的               
    签了签              
     sizeof sizeof              
    静态静态              
                         static_assert       
                        的static_cast         
     struct struct              
    开关开关              
                        模板            
                        这个                
                         thread_local        
                        扔               
                        真正                
                        尝试                 
     typedef typedef             
                         typeid的              
                        类型名            
    工会联盟               
    无符号无符号            
                        运用               
                        虚拟             
    虚空                
    易挥发            
                         wchar_t的             
    虽然               

字符文字的类型从int更改为char (§2.14.3)

字符串文字使const (§2.14.5)

§C1.2基本概念

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

struct是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节)中保持未初始化。

C ++中没有隐式int (第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 lvalue(第12.8节)。

§C1.10预处理指令。

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


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

 #include  #include  #include  #include  #include  #include  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; } 

模板是另一个很大的区别(除了类/对象)。 模板支持例如类型安全的通用容器类型(它们的第一个用例)和(bastardized)lambda表达式( boost::lambda )。

C ++是一种比C语言更大的语言(不仅仅是库)。

这个问题没有简短的答案。
通常C ++支持:
– OOP范式;
– 通用程序;
– 模板乙醇程序设计;
– 抽象数据类型;
– 新的图书馆和标准支持function范式的元素;
– 使您的程序最可支持的其他工具;
– 你也可以编写类似C风格的程序,但使用C ++ compiller;

但纯C – 比C ++快一点,更低级别。

C ++与C相比的另一个特性是以throw … catch的forms进行exception处理。

C ++不仅仅是带有类的C语言。 C ++中还有许多其他概念,如模板,函数和运算符重载,exception以及此处已提到的许多其他概念。 这使得C ++非常强大和灵活,但也很难学习。 并不是单个概念难以理解,而是它们的总和以及它们如何一起玩。 看一下boost,看看C ++可以做些什么。 而且我想要花费很多时间才能理解引擎盖下发生了什么,这在C的情况下非常清楚。

或者简而言之:C ++不仅仅是带有类的C,或者换句话说C ++远不是Java加上内存管理。

在C ++程序员的C ++的两部分中,第一部分列出了一些非OOP差异:

  • 函数的默认参数
  • 函数重载
  • 你可以在你需要的代码中的任何地方声明局部变量,而不仅仅是在函数的开头(也是C99特性)
  • 引用,如int& x
  • 一般的正确性
  • 命名空间
  • 内置布尔类型bool ,带有truefalse关键字(也在C99中通过stdbool.h)
  • 内联关键字和关联的怪癖,包括隐式内联和自动内联
  • 比C更大的标准库