C++知识点总结

C与C++的区别

引用别人说的一段话

C是一个结构化语言,如谭老爷子所说:它的重点在于算法和数据结构。C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现过程(事务)控制),而对于C++,首要考虑的是如何构造一个对象模型,让这个模型能够契合与之对应的问题域,这样就可以通过获取对象的状态信息得到输出或实现过程(事务)控制。 所以C与C++的最大区别在于它们的用于解决问题的思想方法不一样。之所以说C++比C更先进,是因为“ 设计这个概念已经被融入到C++之中
”,而就语言本身而言,在C中更多的是算法的概念。那么是不是C就不重要了,错!算法是程序设计的基础,好的设计如果没有好的算法,一样不行。而且,“C加上好的设计”也能写出非常好的东西。
对语言本身而言,C是C++的子集,那么是什么样的一个子集?从上文可以看出,
C实现了C++中过程化控制及其它相关功能,而在C++中的C(我称它为“C+”),相对于原来的C还有所加强,引入了重载、内联函数、异常处理等等玩艺儿,C++更是拓展了面向对象设计的内容,如类、继承、虚函数、模板和包容器类等等。
再提高一点,在C++中,数据封装、类型这些东东已不是什么新鲜事了,需要考虑的是诸如:对象粒度的选择、对象接口的设计和继承、组合与继承的使用等等问题。
所以相对于C,C++包含了更丰富的“设计”的概念,但C是C++的一个自洽子集,也具有强大的功能,同样值得学习。

C真是C++的子集吗?

C 是 C++ 的子集吗?
严格按照数学上的定义来说,C 不是 C++ 的子集。有些程序在 C 里面是合法的,但在 C++ 里却是不合法的;甚至有些编写代码的方式在 C 和 C++ 中有不同的含义。然而,C++ 支持 C 所支持的全部编程技巧。任何 C 程序都能被 C++ 用基本相同的方法写出来,并且运行效率和空间效率都一样。把数万行 ANSI C 代码转换成 C 风格的 C++ 代码,通常只需要几个小时。因此,C++ 是 ANSI C 的超集程度和 ANSI C 是 K&R C 的超集程度以及 ISO C++ 是 1985 年的 C++ 的超集程度差不多。
编写风格好的 C 程序通常会是合法的 C++ 程序。例如,Kernighan 和 Ritchie 合著的《C 程序设计语言(第二版)》中的所有例子都是 C++ 程序。
C/C++ 兼容性问题的一些例子:

int main() 
{ 
double sq2 = sqrt(2); /* 不是 C++:调用了未经声明的函数 */ 
int s = sizeof('a'); /* 隐蔽的区别:C++ 中是 1,而 C 中却是 sizeof(int) */ 
}

调用未经声明的函数在 C 里是不良风格,而在 C++ 里是非法的。同样的情况还有,传递参数给一个没有在其声明中列出参数类型的函数:

void f(); /* 没有注明参数类型 */
void g() 
{ 
f(2); /* C 中是不良风格。C++ 中不合法 */ 
}

C 里面,void* 可以隐式转换为任何指针类型,并且堆空间分配通常是通过 malloc() 进行的,无法检查是否已经分配了足够的内存:

void* malloc(size_t);
void f(int n) 
{ 
int* p = malloc(n*sizeof(char)); /* C++ 中非法。C++ 使用 new 分配堆空间 */ 
char c; 
void* pv = &c; 
int* pi = pv; /* 隐式转换 void* 为 int*。C++ 中非法 */ 
}

请注意,隐式转换 void* 为 int* 引起了潜在的数据对齐错误。请参阅 C++ 中 void* 和 malloc() 的代替品。
把 C 代码转换成 C++ 时,请紧记 C++ 的关键字比 C 多:

int class = 2; /* C 中合法。C++ 中是语法错误 */ 
int virtual = 3; /* C 中合法。C++ 中是语法错误 */

除了少数例外,如上面所述的例子(以及 C++ 标准和 C++ 程序设计语言第三版附录 B 里详细列举的例子),C++ 是 C 的超集。(附录 B 可以通过下载获取)
请注意,“C”在以上段落中指的是经典 C 和 C89。C++ 不是 C99 的后裔;C++ 和 C99 是兄弟。C99 引入了一些新特性,造成 C/C++ 的不兼容性进一步增大。这里有一篇 C++98 和 C99 的不同点的描述。

=========================================================
以上摘自Bjarne Stroustrup’s FAQ(中文版)

另外,C++兼容C89的标准,不完全兼容C99标准。

一些C++的概念

  • 函数模板:“雪糕模子”,倒入不同的原料,可以产出不同的雪糕。一个模板用于函数体相同,参数的个数相同但类型不同的情况。参数的个数不同是则不能使用函数模板。
  • 多态:字面的意思“多种状态”。它是一些函数名字相同的函数的不同的状态。亦或者说不同功能的函数可以使用相同的函数名,参数或者类型不同。就比如一个函数叫“买东西”,而买什么东西,数量,颜色等等性质,由参数传入,就可以是买水果,买菜,买零食等等。
  • 函数重载:重载的本质是重新定义了一个函数,虽然函数名相同,但它们编译后的名字和函数的入口地址是不同的。参数的个数和类型至少有一项不同,只有函数类型不同是不可以使用函数重载的。
  • 默认参数:传递给函数的参数按照从左至右的顺序与形参结合,所以指定默认参数必须从最右边开始。
  • 默认构造函数:调用默认构造函数时不必给出实参,所以指定了所有参数默认值的构造函数也是默认构造函数。类的构造函数有且只有一个。
  • 后续补充…
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值