GG资源网

如何自学C++?(如何自学cad制图)

提起c语言,很多人都说c语言属于比较难的编程语言,但是一些大型项目设计高复杂度和高要求的项目的时候,c语言还是有很大优势,例如互联网搜索引擎,高性能科学计算,大型网络游戏服务器等等。

那么该如何着手学习c语言呢,我整理了一套系统的学习方案,只要按照这套学习方案进行学习,一定可以学有所成。

先来一张整体的学习线路图:

第一阶段

知识点对应的学习教程:

C语言基础视频

C++基础视频教程

第二阶段:

知识点对应的教程:

c++入门教程:

第三阶段:

知识点对应的教程:

c++深入浅出教程

第四阶段:

知识点对应的教程:

1、服务器开发之linux基础编程

2、服务器开发之linux系统编程

3、服务器开发之linux网络编程F

4、linux嵌入式开发+驱动开发

第五阶段:

QT界面开发教程

视频可评论要哦,另外,附带一张职业规划图

#####

C++是目前编程语言中学习成本比较高的语言之一,C++在图形、音视频处理,通信,游戏,后端服务方面应用还比较广泛,我认为需要C++学习进阶有如下几个步骤:

1、看一下C++方面的编程书籍

1)《C++Primer》,《C++编程思想》这初级读本是所有学习C++的人必须啃的书,C++的知识点比较全。

2)《Effective C++》、《MoreEffective C++》、《C++沉思录》、《Effective STL》这写书比较经典,进阶必备。

3) 《深度探索C++对象模型》、《现代C++设计》、《泛型编程与STL》这些书可以深入理解C++

技术书可以循序渐进看,边学变练,做项目过程中越到问题可以翻翻这些书,有可能有解决问题的思路,项目不忙时,闲下来时可以再看看书。

2、参与C++的项目

边做项目边学习是成长最快的方法,因此要想进阶就必须参与C++的项目,设计开发C++的项目。

3、学习和参与C++开源项目

看看优秀的开源项目可以开阔视野,提高自己

推荐一些优秀开源C++项目

1)STL,Boost都是开源的,可以学习一下

2)Libev libev是一个开源的事件驱动库,基于epoll,kqueue等OS提供的基础设施

3)google的grpc, 基于protobuf的开源rpc, 支持多种编程语言: https://github.com/grpc/grpc

4)google的protobuf, 非常经典, 强烈建议做c++的同学阅读源代码:

https://github.com/google/protobuf

github有大量C++开源,可以看一下

4、经常总结

经常总结,让经验沉淀下来,有条件可以写博客,也经常看看别人的技术博客

#####

我是自学C++的,应该是有资格回答这个问题的。

如果把学成C++的过程用100分来计算

1、开始,+10分,Hello World

工具:

  • 推荐
    • Visual Studio
    • Visual Studio Code
  • 其它
    • Qt Creator
    • 。。。

没错,就是这么任性,C++很难吗?也不过是一门编程语言而已,大概率是没有高数难的。问题的关键是你总能给自己找到理由不走出这至关重要的第一步。

2、看书,+50分

C++是一门古老的编程语言了,该写的基本上都写完了,你能想到的问题基本上都可以在下面这些经典书籍中找到:

问题是这么多的书怎么看得过来?核心的思路是必须形成输入+输出+反馈的闭环:

  • 一定要敲代码
  • 一定要做笔记,最好写博客
  • 有问题去论坛上问

如果你现在只有这60分,你也同样够资格在简历上写精通C++了。对,你没看错,现在的C++应聘者十有八九都没到这个水平,不是因为你的绝对水平有多高,只是因为你的相对水平已经够高了。

3、专题,+20

不要再指望着神功大成再出山行走江湖了,尽快投入到C++工作实战中去才是最好的学习捷径。无论是搞服务器、游戏、UI、算法等等,专题的东西就在专题中学习就够了。

但是为了避免浪费双方的时间,我还是诚恳的建议你,面试前,至少,你应该把下面这几个小例子搞得清清楚楚:

  • 字符串类String
  • 有理数类Rational
  • stl容器测试用例
  • stl算法测试用例

4、关于github,+10

原则上,我并不推荐新手直接去github上找成熟的项目代码看,原因有两个:

  • C++这门语言太灵活,不同的人可以写出不同的风格来
  • C++这门语言太晦涩,真正读懂别人的代码其实不比读古文来得轻松

所以,功力不够的时候与其去东施效颦,还不如不看。最简单的衡量标准可能是:先写够20000行C++代码,再去看别人的成熟项目代码。

5、没有100

C++语言属于那种不管你多么小心谨慎地呵护它,它总能时不时地带给你一些小惊喜,小意外的另类语言。所以,注定没有100分。

#####

作为一个有20多年c++自学经验的老工程师,很愿意分享自己的学习历程。

在这个各种快速开发语言层出不穷、各种技术栈粉墨登场的时代里,还愿意自学C++,我首先假设你是一个富有钻研精神的人、对操作系统底层架构技术充满好奇、愿意为自己的作品呕心沥血、孜孜以求的人,如果是,那么请和我一起踏上c++自学之旅。

首先,需要有比较好的微机原理基础。记得我当时学c++的时候,我们在课堂上已经学习过了51机单片机原理,自己可以动手组装单片机,手动翻译机器码并输入到ROM中,这些基础对于理解C++的内存操作、CPU的指令、IO操作等都非常有帮助。所以如果有可能,可以先学习《微机原理与接口技术》,对硬件部分有基本的了解。这样才好理解C++对于底层接口的操作。

其次,养成良好的编码习惯。熟读Google 的《google c++ style guide 》是我对每一个新入职的同事要求做的第一件事情。在这份指南里,不但告诉了你怎么做,还告诉了你为什么这么做。

然后,要掌握基本的算法基础,多练习用C++实现经典的算法。

最后,多上github,阅读经典的开源代码。

#####

工科男趣谈教育

身为工科男曾经对于c++学习也有过如此迷茫

当年开设的c++对于我们来说很新鲜

同时又很陌生

跟我们以往学习不不一样的

有着很大区别

关于编程的重要性这里就不多讲了

那么主要就来讨论一下如何才能更好学习好

要学好c++首先要有计算机思维

一开始我们学习c++就走了很多弯路

因为从之前数学学习刚进入c的学习

总是会有些以前数学的惯性思维在里面

其实c++就是相当按照计算机思维方式去处理问题

这个跟我们以往用数学思维方式处理问题

是有着很大区别的

所以要学好c++就要具备计算机思维

从计算机的工作方式去思考编程

要学好c++其次要多进行实践编程

就像我们学习数学一样

光知道数学定理公式是没用的

更多需要我们多做题多练习

将数学公式融入到实际解题过程中去

c++也是如此

更需要我们去电脑上进行实际编程

只有多进行实践

才能能加深入理解c++里的奥妙

其实c++也是一门技术

作为一门技术最为重要就是实践

只有不断地实践才能更好掌握技术

所以要想学好c++就得多加实践编程

要想学好c++还可网上论坛跟一群爱好者交流学习

现在网络给我们提供了极大便利性

找到共同爱好学习者一起交流学习

能够更好帮助我们学习

当我们碰到任何问题就能够得到前辈指点迷津

包括也有很多前辈经验传导

所以要想学好c++找到爱好论坛能帮助学习更有效

当然大家有任何问题也可以

加入我们玩得趣科教俱乐部

在这里一起交流学习

如何自学C++?(如何自学cad制图)
如何自学C++?(如何自学cad制图)
如何自学C++?(如何自学cad制图)
如何自学C++?(如何自学cad制图)
如何自学C++?(如何自学cad制图)
#####

C++ primer多看几遍,基础一定要大牢,后面就会好学很多。语言只是一个工具,会使用工具是远远不够的。

#####

学习c++初期可以不必在指针上花费太大的功夫,买一本基础的教材或者从网上下载一个基础的教程看。先学会了解写代码的总体逻辑,就是大体框架,然后再往里边填具体的。等感觉基础学的差不多的时候可以独立写一个小系统,比如:学生成绩查询系统。

#####

本次回答邀请boolean,由他来分享自己在学习C++过程中踩过的那些坑~相信对自学C++的朋友会有帮助~

如果,将编程语言比作武功秘籍,C++无异于《九阴真经》。《九阴真经》威力强大、博大精深,经中所载内功、轻功、拳、掌、腿、刀法、剑法、杖法、鞭法、指爪、点穴密技、疗伤法门、闭气神功、移魂大法等等,无所不包,C++亦如是。

C++跟《九阴真经》一样,如果使用不当,很容易落得跟周芷若、欧阳锋、梅超风等一样走火入魔。这篇文章总结了在学习C++过程中容易走火入魔的一些知识点。为了避免篇幅浪费,太常见的误区(如指针和数组、重载、覆盖、隐藏等)在本文没有列出,文中的知识点也没有前后依赖关系,各个知识点基本是互相独立,并没有做什么铺垫,开门见山直接进入正文。

目录

1 函数声明和对象定义

2 静态对象初始化顺序

3 类型转换

3.1 隐式转换

3.2 显示转换

4 inline内联

5 名称查找

5.1 受限名称查找

5.2 非受限名称查找

6 智能指针

6.1 std::auto_ptr

6.2 std::shared_ptr

6.3 std::unique_ptr

7 lambda表达式

1 函数声明和对象定义

对象定义写成空的初始化列表时,会被解析成一个函数声明。可以采用代码中的几种方法定义一个对象。

    2 静态对象初始化顺序

    在同一个编译单元中,静态对象的初始化次序与其定义顺序保持一致。对于作用域为多个编译单元的静态对象,不能保证其初始化次序。如下代码中,在x.cpp和y.cpp分别定义了变量x和y,并且双方互相依赖。

    x.cpp中使用变量y来初始化x

    y.cpp中使变量x来初始化y

    如果初始化顺序不一样,两次执行的结果输出不一样,如下所示:

      如果我们需要指定依赖关系,比如y依赖x进行初始化,可以利用这样一个特性来实现:函数内部的静态对象在函数第一次调用时初始化,且只被初始化一次。使用该方法,访问静态对象的唯一途径就是调用该函数。改写后代码如下所示:

        getX()函数返回x对象

          y对象使用x对象进行初始化

            打印x和y值。通过这种方式,就保证了x和y的初始化顺序。

              3 类型转换

              这里只描述自定义类的类型转换,不涉及如算数运算的类型自动提升等。

              3.1 隐式转换

              C++自定义类型在以下两种情况会发生隐式转换:

              1) 类构造函数只有一个参数或除第一个参数外其他参数有默认值;2) 类实现了operator type()函数;

                上面定义了一个Integer类,Integer(int)构造函数可以将int隐式转换为Integer类型。operator int()函数可以将Integer类型隐式转换为int。从下面代码和输出中可以看出确实发生了隐式的类型转换。

                  隐式类型转换在某些场景中确实比较方便,如:

                  a、运算符重载中的转换,如可以方便的使Integer类型和内置int类型进行运算

                    b、条件和逻辑运算符中的转换,如可以使智能指针像原生裸指针一样进行条件判断

                      隐式类型转换在带来便利性的同时也带来了一些坑,如下所示:

                        构造函数隐式转换带来的坑。上述代码定义了一个Array类,并重载了operator==运算符。本意是想比较两个数组,但是if(arr1 == arr2)误写成了f(arr1 == arr2[0]),编译器不会抱怨,arr2[0]会转换成一个临时Array对象然后进行比较。

                          operator type()带来的坑。上述String类存在到const char *的隐式转换,strcat函数返回时String隐身转换成const char *,而String对象已经被销毁,返回的const char *指向无效的内存区域。这也是std::string不提提供const char *隐式转换而专门提供了c_str()函数显示转换的原因。

                          3.2 显示转换

                          正是由于隐式转换存在的坑,C++提供explicit关键字来阻止隐式转换,只能进行显示转换,分别作用域构造函数和operator(),如下所示:

                          1) explicit Ctor(const type &);2) explicit operator type();

                            用explicit改写Integer类后,需要进行显示转换才能与int进行运算,如下:

                              为了保持易用性,C++11中explicit operator type()在条件运算中,可以进行隐式转换,这就是为什么C++中的智能指针如shared_ptr的operator bool()加了explicit还能直接进行条件判断的原因。下面代码来自shared_ptr源码。

                                4 inline内联

                                内联类似于宏定义,在调用处直接展开被调函数,以此来代替函数调用,在消除宏定义的缺点的同时又保留了其优点。内联有以下几个主要特点:

                                a、内联可以发生在任何时机,包括编译期、链接期、运行时等;

                                b、编译器很无情,即使你加了inline,它也可能拒绝你的inline;

                                c、编译器很多情,即使你没有加inline,它也可能帮你实施inline;

                                d、不合理的inline会导致代码臃肿。

                                使用内联时,需要注意以下几个方面的误区:

                                1)inline函数需显示定义,不能仅在声明时使用inline。类内实现的成员函数是inline的。

                                  2)通过函数指针对inline函数进行调用时,编译器有可能不实施inline

                                    3)编译器可能会拒绝内联虚函数,但可以静态确定的虚函数对象,多数编译器可以inline

                                      4)inline函数有局部静态变量时,可能无法内联

                                        5)直接递归无法inline,应转换成迭代或者尾递归。下面分别以递归和迭代实现了二分查找。

                                          二分查找的递归方式实现。

                                            二分查找的迭代方式实现。

                                            分别调用二分查找的递归和迭代实现,开启-O1优化,通过查看汇编代码和nm查看可执行文件可执行文件符号,只看到了递归版本的call指令和函数名符号,说明递归版本没有内联,而迭代版本实施了内联展开。

                                            6)构造函数和析构函数可能无法inline,即使函数体很简单

                                              表面上构造函数定义为空且是inline,但编译器实际会生成如右侧的伪代码来构造基类成分和成员变量,从而不一定能实施inline。

                                              5 名称查找

                                              C++中名称主要分为以下几类:

                                              a) 受限型名称:使用作用域运算符(::)或成员访问运算符(.和->)修饰的名称。如:::std、std::sort、penguin.name、this->foo等。

                                              b) 非受限型名称:除了受限型名称之外的名称。如:name、foo

                                              c) 依赖型名称:依赖于形参的名称。如:vector<T>::iterator

                                              d) 非依赖型名称:不属于依赖型名称的名称。如:vector<int>::iterator

                                              5.1 受限名称查找

                                              受限名称查找是在一个受限作用域进行的,查找作用域由限定的构造对象决定,如果查找作用域是类,则查找范围可以到达基类。

                                                5.2 非受限名称查找

                                                5.2.1 普通查找:由内向外逐层查找,存在继承体系时,先查找该类,然后查找基类作用域,最后才逐层查找外围作用域

                                                  5.2.2 ADL(argument-dependent lookup)查找:又称koenig查找,由C++标准委员会Andrew Koenig定义了该规则——如果名称后面的括号里提供了一个或多个类类型的实参,那么在名称查找时,ADL将会查找实参关联的类和命名空间。

                                                    根据类型C的实参c,ADL查找到C的命名空间ns,找到了foo的定义。

                                                    了解了ADL,现在来看个例子,下面代码定义了一个Integer类和重载了operator<运算符,并进行一个序列排序。

                                                      上面的代码输出什么? 1 1 5 10吗。上面的代码无法编译通过,提示如下错误

                                                        operator<明明在全局作用于有定义,为什么找不到匹配的函数?前面的代码片段,应用ADL在ns内找不到自定义的operator<的定义,接着编译器从最近的作用域std内开始向外查找,编译器在std内找到了operator<的定义,于是停止查找。定义域全局作用域的operator<被隐藏了,即名字隐藏。名字隐藏同样可以发生在基类和子类中。好的实践:定义一个类时,应当将其相关的接口(包括自由函数)也放入到与类相同的命名空间中

                                                          把operator<定义移到ns命名空间后运行结果正常

                                                          再来看一个名称查找的例子。

                                                            这段代码编译时提示如下错误,我们用int *实例化D1的模板参数并给m_value赋值,编译器提示无法将int *转换成int类型,也就是m_value被实例化成了int而不是int *。

                                                            我们将代码改动一下,将D2继承B<int>改为B<T>,代码可以顺利编译并输出。

                                                              D1和D2唯一的区别就是D1继承自B<int>,D2继承自B<T>。实例化后,为何D1.m_value类型是int,而D2.m_value类型是int *。在分布式事务领域有二阶段提交,在并发编程设计模式中二阶段终止模式。在C++名称查找中也存在一个二阶段查找。

                                                              二阶段查找(two-phase lookup):首次看到模板定义的时候,进行第一次查找非依赖型名称。当实例化模板的时候,进行第二次查找依赖型名称。

                                                              D1中查找T时,基类B<int>是非依赖型名称,无需知道模板实参就确定了T的类型。

                                                              D2中查找T时,基类B<T>是依赖型名称,在实例化的时候才会进行查找。

                                                              6 智能指针

                                                              6.1 std::auto_ptr

                                                              std::auto_ptr是C++98智能指针实现,复制auto_ptr时会转移所有权给目标对象,导致原对象会被修改,因此不具备真正的复制语义,不能将其放置到标准容器中。auto_ptr在c++11中已经被标明弃用,在c++17中被移除。

                                                                6.2 std::shared_ptr

                                                                std::shared_ptr采用引用计数共享指针指向对象所有权的智能指针,支持复制语义。每次发生复制行为时会递增引用计数,当引用计数递减至0时其管理的对象资源会被释放。但shared_ptr也存在以下几个应用方面的陷阱。

                                                                1)勿通过传递裸指针构造share_ptr

                                                                  这段代码通过一个裸指针构造了两个shared_ptr,这两个shared_ptr有着各自不同的引用计数,导致原始指针被释放两次,引发未定义行为。

                                                                  2)勿直接将this指针构造shared_ptr对象

                                                                    这段代码使用同一个this指针构造了两个没有关系的shared_ptr,在离开作用域时导致重复析构问题,和1)是一个道理。当希望安全的将this指针托管到shared_ptr时,目标对象类需要继承std::enable_shared_from_this<T>模板类并使用其成员函数shared_from_this()来获得this指针的shared_ptr对象。如下所示:

                                                                      3)请勿直接使用shared_ptr互相循环引用,如实在需要请将任意一方改为weak_ptr。

                                                                        代码运行结果,没有看到打印任何内容,析构函数没有被调用。最终你我都没有jump,完美的结局。但是现实就是这么残酷,C++的世界不允许他们不jump,需要将其中一个shared_ptr改为weak_ptr后资源才能正常释放。

                                                                          4)优先使用make_shared而非直接构造shared_ptr。make_shared主要有以下几个优点:

                                                                          a、可以使用auto自动类型推导。

                                                                          shared_ptr<Object> sp(new Object());

                                                                          auto sp = make_shared<Object>();

                                                                          b、减少内存管理器调用次数。shared_ptr的内存结构如下图所示,包含了两个指针:一个指向其所指的对象,一个指向控制块内存。

                                                                            这条语句会调用两次内存管理器,一次用于创建Object对象,一次用于创建控制块。如果使用make_shared会一次性分配内存同时保存Object和控制块。

                                                                            c、防止内存泄漏。

                                                                              这段代码可能发生内存泄漏。一般情况下,这段代码的调用顺序如下:

                                                                              new Handler() ① 在堆上创建Handler对象

                                                                              shared_ptr() ②创建shared_ptr

                                                                              getData() ③调用getData()函数

                                                                              但是编译器可能不按照上述①②③的顺序来生成调用代码。可能产生①③②的顺序,此时如果③getData()产生异常,而new Handler对象指针还没有托管到shared_ptr中,于是内存泄漏发生。使用make_shared可以避免这个问题。

                                                                                这条语句在运行期,make_shared和getData肯定有一个会先调用。如果make_shared先调用,在getData被调用前动态分配的Hander对象已经被安全的存储在返回的shared_ptr对象中,接着即使getData产生了异常shared_ptr析构函数也能正常释放Handler指针对象。如果getData先调用并产生了异常,make_shared则不会被调用。

                                                                                但是make_shared并不是万能的,如不能指定自定义删除器,此时可以先创建shared_ptr对象再传递到函数中。

                                                                                  6.3 std::unique_ptr

                                                                                  std::unique_ptr是独占型智能指针,仅支持移动语义,不支持复制。默认情况下,unique_ptr有着几乎和裸指针一样的内存开销和指令开销,可以替代使用裸指针低开销的场景。

                                                                                  1)与shared_ptr不同,unique_ptr可以直接指向一个数组,因为unique_ptr对T[]类型进行了特化。如果shared_ptr指向一个数组,需要显示指定删除器。

                                                                                    2)与shared_ptr不同,unique_ptr指定删除器时需要显示指定删除器的类型。

                                                                                      7 lambda表达式

                                                                                      1)捕获了变量的lambda表达式无法转换为函数指针。

                                                                                        2)对于按值捕获的变量,其值在捕获的时候就已经确定了(被复制到lambda闭包中)。而对于按引用捕获的变量,其传递的值等于lamdba调用时的值。

                                                                                          3)默认情况下,lambda无法修改按值捕获的变量。如果需要修改,需要使用mutable显示修饰。这其实也好理解,lambda会被编译器转换成operator() const的函数对象。

                                                                                            4)lambda无法捕捉静态存储的变量。

                                                                                              #####

                                                                                              1、有c语言基础吗?如果没有,建议从谭浩强的c语言这本书开始,基本的语法、指针这些要会,学完这个,可以自己写写demo,或者实现一些函数(如strcpy, strnlen等,面试常考),或者c++的stl里的一些类(如string,vector等)来检验自己是否真的会了。

                                                                                              2、然后看《C++ Primer Plus(第6版 中文版)》,这本很经典,一版再版了,内容比较详实,边学边写demo(一定要上电脑测试程序,测试的时候学习下gdb调试程序)。

                                                                                              学完上面2个,你就基本入门c++了。剩下的就是提高和加深理解了(看优秀源码,跟项目做)

                                                                                              3、程序=数据结构+算法,会了语言,一般要熟悉些基础的数据结果和算法知识《数据结构(C语言版)清华大学计算机系列教材》

                                                                                              4、c++进阶需要看的书籍:

                                                                                              《Effective C++:改善程序与设计的55个具体做法》

                                                                                              《深度探索C++对象模型》

                                                                                              《More Effective C++:35个改善编程与设计的有效方法(中文版)》

                                                                                              #####

                                                                                              先学基本语法,不要死记硬背,然后学着编码,就写在main函数中;

                                                                                              学会调试,记住一点,任何程序都是调试或测试出来的,只要是稍大的项目都是,那些用print输出调试,那只是在搞笑。

                                                                                              学会函数调用,类调用,跨文件调用(如:外部变量)

                                                                                              再次学习基本的,如变量种类,变量所占字长,在内存中排列。

                                                                                              指针,不要怕他,但要敬畏,敢用,但一定要知道他指向谁,初学者一定不要随意改变指针地址,可以改变值,对new出来的,知道在什么地方delete,delete后记得赋值null,记得野指针。

                                                                                              熟练使用stl,不会写,但要知道原理,在哪种情况下用那种容器与对应算法。

                                                                                              到玩在可以学些设计模式,学这个我自己有三层感悟:看山似山,看水似水;看山不是山,看水不是水;看山还是山,看水还是水;做过几个项目后,自己感触,以前是为了设计模式而设计模式;

                                                                                              这个时候应该学了快一年了,慢的话是两年,算是入门了。

                                                                                              可以进行一些模块设计,性能优化,重购,这个学习需要在项目中学习,然后看些网络,内存池,线程池,并行,数据库方面的,需要2-5年。

                                                                                              建议:

                                                                                              买书,纸质方面的,看电子版,手中无一本纸质书的,我没见过,都有书在手,好书看多遍;那种21天的书飘过,害人不浅。

                                                                                              多学习基本的,十年后就明白,程序最后用的是那些基本的东西;

                                                                                              指针一定要学好,如果这门语言是九阳真经的话,那指针就是九阳真经最后也是最难练的;

                                                                                              学好c++,学其他中高级语言,一般是3-7天可上手做软件了。

                                                                                              记得学会调试。

                                                                                              最好找一个高手带,可以缩短大半时间。

                                                                                              由于网站搬家,部分链接失效,如无法下载,请联系站长!谢谢支持!
                                                                                              1. 带 [亲测] 说明源码已经被站长亲测过!
                                                                                              2. 下载后的源码请在24小时内删除,仅供学习用途!
                                                                                              3. 分享目的仅供大家学习和交流,请不要用于商业用途!
                                                                                              4. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
                                                                                              5. 本站所有资源来源于站长上传和网络,如有侵权请邮件联系站长!
                                                                                              6. 没带 [亲测] 代表站长时间紧促,站长会保持每天更新 [亲测] 源码 !
                                                                                              7. 盗版ripro用户购买ripro美化无担保,若设置不成功/不生效我们不支持退款!
                                                                                              8. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
                                                                                              9. 如果你也有好源码或者教程,可以到审核区发布,分享有金币奖励和额外收入!
                                                                                              10.如果您购买了某个产品,而我们还没来得及更新,请联系站长或留言催更,谢谢理解 !
                                                                                              GG资源网 » 如何自学C++?(如何自学cad制图)

                                                                                              发表回复

                                                                                              CAPTCHAis initialing...