题主用c刷了某oj官方提供的题单,对c语言有了一点点的掌握。请问如何高效地过渡到c++呢?(这里指的过渡不是c with class)


推荐一本书 The C++ Annotations . C 语言向 C++ 过渡, 讲的超细.

有一点不太理解, 虽然 C++ 肯定不是 C with class, 不过, 我觉得这样过渡挺好的. C -&> C with Class -&> C++.

另外, C++ 永远大多时候避免不了高性能需求, 摆脱 C 是挺难的, 所以感觉没办法像学习其他语言一样, 完全当成一门全新的语言去学习.


《c++ primer》这本书就比较适合。


C的东西相比于C++太少了……

建议在C基础下从头开始学C++


从new一对象开始


C++是在c的基础上增加了一些特性和机制,这些特性和机制是为了面向对象而服务的。而c语言的编程主要是面向过程的。

如果要从c转到C++,那就需要学习面向对象思维,学习如何用C++的方法去实现面向对象的编程。主要还是思维的转变。

如何做到思维的转变,可以通过学习面向对象的设计原则和设计模式来达到思维的转变。


刘汝佳的紫书不是有cpp的内容。对著上面的cpp部分学就行。

起码演算法题够用(小声)


c语言过渡到c++主要涉及下面几方面

头文件与命名空间

C语言没有命名空间的概念,而C++有,最典型的是初学时经常用到的using namespace std; 代表使用命名空间std,或者使用std::functuion(); ,即函数、变数名前面加上空间名和域解析符来使用命名空间。命名空间可以嵌套定义。

为了统一,C++会把C语言的stdio.h math.h string.h 等xxx.h格式的标准头文件用 cstdio cmath cstring 等cxxx格式的C++头文件来替代,从而保留了C语言的标准库函数。

输入输出

C语言常用的是scanf printf 的函数,C++用的是cin cout 对象。C语言的方式更快而且格式控制更方便,而C++的方式能够自动识别了输入输出的类型,自动转换成合适的字元串。

bool 类型

C++用于判断真与假的类型,其大小并没有被规定。C++还有true false 关键字。

当然C语言也可以通过各种方式来定义和使用true和false,但不像C++那样作为关键字,没有C++来的可靠。比如 if(func() == true)就是危险的行为。

string 类型

C++语言处理字元串的类,相比于时刻需要注意越界和』 』的字元数组,显然更好用。由于构造函数的存在,char *类型的变数很容易构造出string类型。

当需要使用字元数组时,string类型也有相应的c_str函数。 不过注意函数返回的是临时的常指针,如果需要对其修改,需要用strcpy()等函数复制出副本,再对副本操作。

const

C语言中的const代表该变数初始化之后,只能读不能改。但是并不代表每次取值都是一样的,因为还可以通过其他方式修改变数。就像只读方式打开文件一样,你不能对他修改,但是如果这个文件可以被其他人修改,你就不能保证每次读到的内容是一样的。

C++对const的处理更加复杂,假如你用const定义了一个常量var,那么它会被认为是一个常量,哪怕对应地址的内容被强行修改了,访问var时仍然得到的是修改前的内容。

变数定义位置

C语言中的C89标准规定,在代码块里执行语句不能出现在变数定义语句之前。但是C++没有这个限制,只要变数被使用时已经被声明或定义即可。

动态内存管理

C语言只能用malloc等函数开辟一块堆内存,其大小需要计算,返回的指针需要类型转换,内容需要手动去初始化。

而C++申请堆内存的时候可以调用构造函数,释放时能使用析构函数,更方便更安全。

类型转换

C语言可以用小括弧进行类型转换。最常见的是malloc函数返回指针的类型转换。

C++的类型转换更加清晰严格,有四种 const_cast static_cast dynamic_cast reinterpret_cast

而且对于类来说,可以自定义类型转换的函数。

默认参数与函数重载

C语言不支持默认函数和函数重载,需要定义更多的函数名。

C++支持默认参数和函数重载,可以大大减少工作量。

指针与引用

C++中,引用的指向不能改变,所以很多情况下C++引用能够代替指针。

空指针

C语言有NULL宏,用于标记空指针

C++有nullptr关键字。c++不允许直接将void*隐式的转化为其他类型,nullptr的类型为nullptr_t,能够隐式的转换为任何指针,所以用空指针就尽可能的使用nullptr。

智能指针

C++不同标准下定义了许多智能指针,用于自动回收不需要的动态内存,这一点比C语言中的指针方便。


1.C和C++的区别:

  • C语言可以在C++编译器上完美运行,即C属于C++
  • C++比C多出来一些函数库
  • C++是面向对象编程(即有class以及相关工具)

2.如何从C过渡到C++

2.1 代码实例:(C语言版)uva11000.

#include&
int main()
{
long long m = 0, fm = 1, sum = 1;
int n,i;
while(scanf("%d",n),n != -1){
m = 0, fm = 1, sum = 1;
for(i = 0;i &< n;i++){ fm = m + 1; m = sum; sum = m + fm; } printf("%lld %lld ",m,sum); } return 0; }

重点不在于解上面这题,请将重点放在写法。以上是C语言写法,为什么说是C语言写法呢?因为上述代码有几个C独有的特点:

  • 第1行:#include&
  • 第5行:scanf("%d",n)
  • 第13行:printf("%lld %lld
    ",m,sum);

这三点也是C和C++最基本的区别,下面看C++版本:

#include&
using namespace std;
int main()
{
long long m = 0, fm = 1, sum = 1;
int n,i;
while(cin &>&> n,n != -1){
m = 0, fm = 1, sum = 1;
for(i = 0;i &< n;i++){ fm = m + 1; m = sum; sum = m + fm; } cout &

  • 第1行:#include&
  • 第2行:using namespace std;
  • 第6行:cin &>&> n;
  • 第14行:cout &
  1. 其中第1行头文件iostream,和C语言中的stdio.h类似,可以对比理解。
  2. 第2行的using namespace std 的意思是声明使用命名空间std。可以不深入理解,只要写C++就敲这一行就可以了。(想了解的直接百度就可以,很简单)
  3. 第6行:cin全名叫 标准输入流。和C语言中的scanf用法类似,只是它用起来更为方便(大多数情况下),不需要区分不同的类型用不同的写法,所有类型只需要用cin &>&> (变数名)就可以了。
  4. 第14行:和cin类似,cout是标准输出流,与C中的printf类似,但是它也不用区分不同的类型用不同输出符号,不管什么类型只要用cout &

2.2 初步掌握C++:

如果你已经明白上面4个C++的特点的话,那现在你用C编写代码有多顺畅你用C++就可以同样顺畅了。因为其他写法(for、if、else……)和C完全相同。

3.如何利用C++的优点(提高):

一开始就提到,C++和C的不同在于C++丰富的函数库,其中最方便的是STL(一个库名)。很多书会讲这一个库单独拿出来讲,其中包括一些非常方便的容器(vector、map),现在看不懂也没关系,这个是需要花时间学的。从C过渡到C++只需要一个下午(C基础好),但是学会使用C++的各种函数,需要花很久。

4.推荐书籍:

个人入门用的是《C++ primer plus》第六版。这本书很厚,但是不需要看完,就像用字典一样看它就可以(用来看各种函数定义)。然后是提高,建议买一本专门讲STl的书来深入掌握STL,因为它真的很重要。


泻药

推荐一下,黑客教父王宝明,具体课程百度即可


多做多学,多琢磨,找规律,因为我现在也出于学习阶段,我感觉这样下去应该能够成功


推荐阅读:
相关文章