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 ++中, static
或extern
说明符只能应用于对象或函数的名称。 在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
,带有true
和false
关键字(也在C99中通过stdbool.h)- 内联关键字和关联的怪癖,包括隐式内联和自动内联
- 比C更大的标准库