作为一个java程序员 转过来作c++,还是要有一段阵痛期的,以下是我个人c++成长路上 遇到的各种问题的收集(有时候太懒,有些问题没有收集进来,后悔)
1. undefined reference to 'xxx'
原因 :
编译过了,但是link时没有找到目标文件(.o,.so,.a等)
解决 :
在编译中要加 -lxxx参数
e.x:gcc thread.c -o thread -lpthread
2. 在linux环境下 开发c++程序,编译时提示找不到process.h
原因:
C++标准头文件中没有process.h,process.h是微软写的
解决:
换成:#include <pthread.h>
3.explicit关键字的作用
explicit主要用于防止隐式转换,用于修饰构造函数、复制构造函数。
c++默认是允许隐式转换的,这样灵活啊,但同时就容易引起问题,详细例子:
http://www.programlife.net/cpp-explicit-keyword.html
4.成员函数模板
有关成员函数模板的一个应用在智能指针的例子,对于理解智能指针的实现很有帮助。
http://www.programlife.net/member-function-templates.html
5.迭代字符串时谨慎使用string::size_type
迭代字符串时谨慎使用string::size_type,应该使用迭代器,这涉及到unsigned int类型越界的问题,具体原因看
http://www.programlife.net/be-careful-when-use-stringsize_type.html
6.方法返回时,减少copy对象的办法
如果一个方法返回一个对象,正常会导致一次构造函数,一次copy构造函数以及一次析构函数的开销,但可以进行优化到只发生一次构造函数,具体做法:
由
T doSomeThing()
{
T t(123);
return t;
}
改为
T doSomeThing()
{
return T(123);
}
7.找不到动态链接库的解决方法
现象举例:“./test: symbol lookup error: ./test: undefined symbol: ……”
原因:
程序使用的动态库存放的位置和Makefile里编译的动态库存位置不同。
解决:
1)ldd来查看动态链接库的定位情况:
ldd xxx
2)修改/etc/ld.so.conf,把你需要的动态链接库的搜索路径加进去
3)执行 ldconfig 命令 刷新 系统的共享库缓存,即 /etc/ld.so.cache 文件
知识点:
1、 如果使用 ldd 命令时没有找到对应的共享库文件和其具体位置,可能是两种情况引起的:
- 共享库没有安装在该系统中;
- 共享库保存在 /etc/ld.so.conf 文件列出的搜索路径之外的位置。
通常情况下,许多开放源代码的程序或函数库都会默认将自己安装到 /usr/loca l 目录下的相应位置(如:/usr/local/bin 或 /usr/local/lib),以便与系统自身的程序或函数库相区别。而许多 Linux 系统的 /etc/ld.so.conf 文件中默认又不包含 /usr/local/lib。因此,往往会出现已经安装了共享库,但是却无法找到共享库的情况。具体解决办法如下:
检查 /etc/ld.so.conf 文件,如果其中缺少 /usr/local/lib 目录,就添加进去;注意: 在修改了/etc/ld.so.conf 文件或者在系统中安装了新的函数库之后,需要运行一个命令:ldconfig , 该命令用来刷新系统的共享库缓存,即 /etc/ld.so.cache 文件。为了减少共享库系统的库搜索时间,共享库系统维护了一个共享库 so 名称的缓存文件/etc/ld.so.cache。因此,在安装新的共享库之后,一定要运行 ldconfig 刷新该缓存。
2、 使用nm命令也可以获取库函数的信息;nm命令可以列出一个函数库文件中的符号表,它对静态的库函数和共享的库函数都能起作用。
8.如何打patch ^_^
svn diff > aaa.patch
patch –Np0 < ../aaa.patch
patch -Rp0< ../aaa.patch
9. 调用STL的sort方法时 出现了:[error]: no match for 'operator -','operator +'
原因:
STL sort方法需要接收RandomAccessIterator类型的迭代器,而如果待排序的容器没有提供随机访问迭代器,那么就会出现此错误。比如list。
知识点:
迭代器类型 http://www.cplusplus.com/reference/iterator/
10.计算两个迭代器之间距离的方法
std:: distance
此外 vector<T>::iterator是可以 实现 +n ,-n操作的,其他STL容器的iterator不行。
11. 怎样取得进程识别码
getpid
c函数,取得进程识别码
12.setw与setfill
在C++中,setw(int n)用来控制输出间隔。
例如:
cout<<'s'<<setw(8)<<'a'<<endl;
则在屏幕显示
s a
//s与a之间有7个空格,setw()只对其后面紧跟的输出产生作用,如上例中,表示'a'共占8个位置,不足的用空格填充。若输入的内容超过setw()设置的长度,则按实际长度输出。
setw()默认填充的内容为空格,可以setfill()配合使用设置其他字符填充。
如
cout<<setfill('*')<<setw(5)<<'a'<<endl;
则输出:
****a //4个*和字符a共占5个位置。
13.如何通过c++执行系统命令
system
c++用system函数来执行系统命令,类似java的Runtime类
14.typeof
C++ typeof在实际编程中主要就是帮助开发人员获取表达式的值的类型,并且还能获取表达式的类型。
比如:
vector<map<string, Any> > inputs;
for (typeof(inputs.begin()) it = inputs.begin(); it != inputs.end(); ++it)
{
...
}
上面等价于:
vector<map<string,Any> >::iterator it;
for(it = inputs.begin(); it != inputs.end(); ++it)
{
...
}
15.typeid()
用来获得一个变量的类型
16.sizeof()
计算数据空间的字节数
1.与strlen()比较
strlen()计算字符数组的字符数,以"\0"为结束判断,不计算为'\0'的数组元素。
而sizeof计算数据(包括数组、变量、类型、结构体等)所占内存空间,用字节数表示。
2.指针与静态数组的sizeof操作
指针均可看为变量类型的一种。所有指针变量的sizeof 操作结果均为4。
注意:int *p; sizeof(p)=4;
但sizeof(*p)相当于sizeof(int);
对于静态数组,sizeof可直接计算数组大小;
例:int a[10];char b[]="hello";
sizeof(a)等于4*10=40;
sizeof(b)等于6;
注意:数组做型参时,数组名称当作指针使用!!
void fun(char p[])
{sizeof(p)等于4}
double* (*a)[3][6];
cout<<sizeof(a)<<endl; // 4 a为指针
cout<<sizeof(*a)<<endl; // 72 *a为一个有3*6个指针元素的数组
cout<<sizeof(**a)<<endl; // 24 **a为数组一维的6个指针
cout<<sizeof(***a)<<endl; // 4 ***a为一维的第一个指针
cout<<sizeof(****a)<<endl; // 8 ****a为一个double变量
3.格式的写法
sizeof操作符,对变量或对象可以不加括号,但若是类型,须加括号。
4 .使用sizeof时string的注意事项
string s="hello";
sizeof(s)等于string类的大小,sizeof(s.c_str())得到的是与字符串长度。
5.union 与struct的空间计算
总体上遵循两个原则:
(1)整体空间是 占用空间最大的成员(的类型)所占字节数的整倍数
(2)数据对齐原则----内存按结构成员的先后顺序排列,当排到该成员变量时,其前面已摆放的空间大小必须是该成员类型大小的整倍数,如果不够则补齐,以此向后类推
注意:数组按照单个变量一个一个的摆放,而不是看成整体。如果成员中有自定义的类、结构体,也要注意数组问题。
17.fcntl函数
http://wenku.baidu.com/view/d0ba91610b1c59eef8c7b49f.html
18.c++main函数参数说明
http://www.cppblog.com/wally-ye/archive/2011/04/07/143573.html
在c++中
void main() 是不对的。
正确的是
int main(int argc,char* args[])
其中 argc=参数个数,而函数名永远是第一个参数,即args[0] = 参数名,因此argc一定>=1. 用户自定义的参数则从args[1]开始。
19.c++ Allocator总结
有关allocator的最重要的事实是它们只是为了一个目的:封装STL容器在内存管理上的低层细节。你不应该在自己的代码中直接调用 allocator 的成员函数,除非正在写一个自己的STL容器。你不应该试图使用allocator来实现operator new[];这不是allocator该做的。 如果你不确定是否需要使用allocator,那就不要用。
http://hi.baidu.com/sucjhwaxp/blog/item/58d143ec996853ceb31cb1f9.html
20.c++关于声明和定义的深刻解释
http://hi.baidu.com/piao123521/item/9b74e2aca9137439020a4d54 、
21.优秀博客
http://hi.baidu.com/new/piao123521
http://liutiemeng.blog.51cto.com/120361/18749
22.double free??
http://www.cppblog.com/tankzhouqiang/
23.objdump选项解释
http://my.oschina.net/alphajay/blog/7729
24.BSS段
可执行程序包括BSS段、数据段、代码段(也称文本段)。 BSS(Block Started by Symbol)通常是指用来存放程序中未初始化的全局变量和静态变量的一块内存区域。 注意和数据段的区别,BSS存放的是未初始化的全局变量和静态变量,数据段存放的是初始化后的全局变量和静态变量。 UNIX下可使用size命令查看可执行文件的段大小信息。如size a.out。
25.友元与命名空间
现象:
声明类B是类A的友员,但是编译时,仍然提示无法访问类A的私有成员。
namespace a { class A { friend class B; private: string a; } } class B { public: void outputA(const A& aobj) { cout<<aobj.a<<endl; } }
原因:
B跟A不在同一个命名空间中。而friend语句没有指明命名空间,那么c++认为a::B才是a::A的友员,而a::B与B不是一个。
http://elephantliu.blog.51cto.com/1107116/610844
形如这样的错误:
build/release64/scheduler/job/unittest/xml_saxparser_unittest.cpp:164: error: within this context
build/release64/scheduler/job/job_sax_parser.h:44: error: 'struct apsara::odps::scheduler::JobSAXParser::Parameter' is private
26.使用gdb进行debug
http://blog.chinaunix.net/space.php?uid=20372841&do=blog&id=1695216
27.svn diff时 某文件被当作binary 文件,而无法得到diff结果如何处理?
现象:This is a binary file. The content cannot be displayed.
方法一:
svn diff --force path/to/file
方法二:
svn propset svn:mime-type 'text/plain' path/to/file
28.errno-base.h 和errno.h
它们是linux下错误定义编码的头文件,
1.errno.h可以直接使用作为头文件,而errno-base.h则需要使用完整路经来作为头文件
#include<errno.h>没问题。而用#include<errno-base.h>编译时提示找不这个头文件,需使用完整路经。
2.errno.h中已经嵌套包含了errno-base.h。errno.h 中有句#include <asm-generic/errno-base.h>
errno.h记录了35-132,errno-base.h为1-34。经证明使用errno-base.h地方可以用errno.h替代,反之不行。
29.semaphore.h
信号量编程
sem_wait
sem_init
pthread.h
30.位操作符
http://www.cppblog.com/richardhe/articles/58071.html
31.ASCII 表
http://www.programfan.com/blog/article.asp?id=18647
terninate called after throwing an instance of 'std::logic_error'
what(): basic_string::_S_construct NULL not valid
Aborted
32.日期&时间
http://yusy1116.blog.163.com/blog/static/646725922009101235322389/
33.线程相关
thread_cancel
http://www.cnblogs.com/xiedan/archive/2009/12/16/1625977.html
34.STL map与Boost unordered_map 的不同
1.Boost.Unordered 和 C++ 标准里的容器的不同之处在于—— Boost.Unordered 不要求其中的元素是可排序的, 因为它不会做出排序操作在排序操作无足轻重时(或是根本不需要), Boost.Unordered 就很合适了。
2.STL的map是按照operator<进行排序,而Boost.Unordered是计算元素的hash值,根据hash值,是无序的
3.Boost.Unordered 需要其中的元素可计算 Hash 值。 一些类似于 std::string 的数据类型“天生”就支持 Hash 值的计算。 对于那些自定义的类型, 你需要手动的定义 Hash 函数 hash_value, 并重载operator==,因为在hash值相同的情况下,则需要通过调用operator==来进行判断。
4.在调试时,map的元素很容易就看到,并能进行即时分析,而Boost.Unordered中的元素要看就比较麻烦,没有这么直观
35.没有名字的名字空间的用途
{
int a;
}
与
static int a;
效果很像,但又不相同。static 会修改一个变量的linkage, 即static修饰的变量 只有内部链接性,只能在定义它的文件内部使用。
而匿名命名空间中的变量的linkage仍然是外部的,只不过由于匿名命名空间没有名字,外部没法使用这个变量而以。
这种区别,在需要模板非类型参数 时就派上用途了。详情见:
http://blog.csdn.net/nodeathphoenix/article/details/6045928
36. 函数指针与 function的区别
typedef function<void (NuwaServiceStubImpl*, CmdEnv&)> Manipulator;等价于
typedef void (*Manipulator)(NuwaServiceStubImpl*, CmdEnv&)吗?
答案是:No
其实其等价于:
typedef void (*Manipulator)(CmdEnv&)
function实际上是std::tr1::function
http://www.cnblogs.com/qlee/archive/2011/07/04/2097594.html
函数指针是c的东西,而function是c++的东西,后者可以实现前者的功能,而且还能做到前者做不到的东西,比如,你想绑定一个类的非静态方法,那就要用function了。
37.如何利用linux系统生成随机数
/dev/urandom
http://zxjgoodboy.i.sohu.com/blog/view/43935985.htm
38.c++中 union
“联合”是一种特殊的类,也是一种构造类型的数据结构。在一个“联合”内可以定义多种不同的数据类型, 一个被说明为该“联合”类型的变量中,允许装入该“联合”所定义的任何一种数据,这些数据共享同一段内存,已达到节省空间的目的(还有一个节省空间的类型:位域)。 这是一个非常特殊的地方,也是联合的特征。另外,同struct一样,联合默认访问权限也是公有的,并且,也具有成员函数。
http://zwkufo.blog.163.com/blog/static/25882512010729101816347/
39.什么是异或?实际编程中用途
异或等价于 不带进位的二进制加法。
1+1=0(因为没有进位)
1+0=1
0+1=1
0+0=0
实际编程中,异或可以实现高效的交换两个变量。
利用异或,仅使用两个变量进行交换,如: a=a^b; b=a^b; a=a^b; 这样就完成了a与b的交换。
40.boost::call_once用途
用于保证某个函数不被多个线程同时执行
41.svn 回滚版本
http://www.cnblogs.com/jndream/archive/2012/03/20/2407955.html
42.<sys/ioctl.h>用途
控制I/O设备 ,提供了一种获得设备信息和向设备发送控制参数的手段。用于向设备发控制和配置命令 ,有些命令需要控制参数,这些数据是不能用read / write 读写的,称为Out-of-band数据。也就是说,read / write 读写的数据是in-band数据,是I/O操作的主体,而ioctl 命令传送的是控制信息,其中的数据是辅助的数据。
43.使用libxml2进行xml schema校验
基于libxml+libxslt实现Schema模式验证与XSLT模板转换
XML Schema:
C代码
#include "libxml/tree.h"
#include "libxml/parser.h"
#include "libxml/xmlschemas.h"
/****************************************************
@describle 应用XML Schema模板文件验证案例文档
@param schema_filename 模式文件
@param xmldoc XML格式的案例文档
@retval >=0 验证成功
< 0 验证失败
****************************************************/
int is_valid(const char *schema_filename, const char *xmldoc) {
xmlDocPtr doc;
doc = xmlReadFile(xmldoc, NULL, XML_PARSE_NONET|XML_PARSE_NOENT);
if ( NULL == doc) {
MessageBox(NULL,"读取XML文档错误",NULL,NULL);
return -1;
}
xmlDocPtr schema_doc = xmlReadFile(schema_filename, NULL, XML_PARSE_NONET|XML_PARSE_NOENT);
if ( NULL == schema_doc) {
MessageBox(NULL,"读取Schema错误",NULL,NULL);
return -1;
}
xmlSchemaParserCtxtPtr parser_ctxt = xmlSchemaNewDocParserCtxt(schema_doc);
if (NULL == parser_ctxt) {
return -1;
}
xmlSchemaPtr schema = xmlSchemaParse(parser_ctxt);
if (schema == NULL) {
return -1;
}
xmlSchemaValidCtxtPtr valid_ctxt = xmlSchemaNewValidCtxt(schema);
if (NULL == valid_ctxt) {
return -1;
}
int is_valid = (xmlSchemaValidateDoc(valid_ctxt,doc) == 0);
xmlSchemaFreeValidCtxt(valid_ctxt);
xmlSchemaFree(schema);
xmlSchemaFreeParserCtxt(parser_ctxt);
xmlFreeDoc(schema_doc);
return is_valid;
}
XSLT:
C代码
#include "libxslt/xslt.h"
#include "libxslt/xsltInternals.h"
#include "libxslt/transform.h"
#include "libxslt/xsltutils.h"
/****************************************************
@describle 应用XSLT模板转换案例格式
@param stylesheet XSLT模板文件
@param olddoc 待转换案例文件
@param newdoc 转换后的案例文件
@retval >=0 转换成功
< 0 转换失败
****************************************************/
int xslt(const char *stylesheet, const char *olddoc, const char *newdoc) {
const char *params[16+1];
int ret;
xsltStylesheetPtr cur = NULL;
xmlDocPtr doc, res;
FILE *outfp;
/*设置参数*/
params[0] = NULL;
/*设置libxml*/
xmlSubstituteEntitiesDefault(1);
xmlLoadExtDtdDefaultValue = 1;
cur = xsltParseStylesheetFile((const xmlChar *)stylesheet);
if ( NULL == cur ) {
MessageBox(NULL,"分析XSLT模板文件出错",NULL,NULL);
return -1;
}
doc = xmlParseFile(olddoc);
res = xsltApplyStylesheet(cur, doc, (const char **)params);
if ( NULL == res ) {
MessageBox(NULL,"应用模板出错",NULL,NULL);
return -1;
}
if (NULL == res->children) {
MessageBox(NULL,"res->children为NULL",NULL,NULL);
return -1;
}
ret = xsltSaveResultToFilename(newdoc,res,cur,0);
xsltFreeStylesheet(cur);
xmlFreeDoc(res);
xmlFreeDoc(doc);
xsltCleanupGlobals();
xmlCleanupParser();
return ret;
}
44. c++匿名对象的生命周期
class Foo { public: void print() { cout<<A().doSomething()<<endl; } }
A().doSomething()这句话就实例化A的一个匿名对象。它的生命周期仅仅当前行!
45.c++默认增加了哪些方法
class A: { private: string a; public: string GetA(){return a;); }
编译这样一个简单的c++ class,编译器默认给你增加了哪些方法呢?
1) 默认构造函数 A(){}
2)默认析构函数 ~A(){}
3)默认copy构造函数A(const A& a){...}
4)默认赋值操作符函数 A operator =(const A& a){...}
5)地址操作符函数 A* operator &(){...}
46. 使用STL容器如何实现多态
通过存储指针类型(最好是智能指针:tr1::memory::shared_ptr),来实现多态。
存储值类型 是不行的,这样的话,容器内存储的都是父类型的对象。
47. void 和void*
一,void关键字表示“空类型”的概念。但是,这里的“空类型”不表示“任意类型”,而是表示不存在的意思,也就是说C/C++不允许你写语句void a,不存在类型为void的东西.
void表示“不存在”的意思,可以从void的两个应用中加以体现:
1.void作为函数的返回值类型时,表示函数返回值不存在,即函数没有返回值
2.void作为函数的参数的限定时,表示函数形参不存在,即函数没有形参。
二、void*
void*表示“空类型指针”,与void不同,void*表示“任意类型的指针”或表示“该指针与一地址值相关,但是不清楚在此地址上的对象的类型”。 (为什么不用void表示任意类型的数据呢?大家都知道,C/C++是静态类型的语言,定义变量就会分配内存,然而,不同类型的变量所占内存不同,如果定 义一个任意类型的变量,如何为其分配内存呢?所以,C、C++中没有任意类型的变量。但是,所有指针类型的变量,无论是int*、char*、 string*、Student*等等,他们的内存空间都是相同的,所以可以定义“任意类型的指针”)
C++/ANSI C:
void*指针只支持几种有限的操作:与另一个指针进行比较;向函数传递void指针或从函数返回void*指针;给另一个void*指针赋值。不允许使用void*指针操作它所指向的对象,例如,不允许对void*指针进行解引用。不允许对void*指针进行算术操作。
GNU C:
GNU C指定void*指针的算术操作与char*一致。
void*表示“任意类型的指针”,主要运用于内存操作函数的形参类型和返回值类型(内存操作与内存中数据类型无关,即任意类型都可以)。
http://blog.sina.com.cn/s/blog_8961925401016t9y.html
void* 如何释放?
直接这样:
void* vptr;
...
delete vptr;
会报错:warning: deleting 'void*' is undefined
相关推荐
想学c++的朋友可以看看,学习基础知识.《C++ Primer 中文版(第5版)》所有示例均全部采用 C++11 标准改写,这在经典升级版中极其罕见——充分体现了 C++ 语言的重大进展及其全面实践。书中丰富的教学辅助内容、醒目的...
首先要说明的是,C和C++是两件截然不同的东西,学习C++可以完全没有C的基础,或者说可以完全不用先学C;但是,这样你是永远也不可能成为真正的C++大师的;你最多只能成为一个C++的熟练工人;C和C++有一个共同的奥义...
5. **图**:图是由顶点和连接顶点的边组成的。它可以表示各种关系,如网络、关系数据库等。在C++中,图可以通过邻接矩阵或邻接表来实现。 6. **堆栈**:堆栈是一种后进先出(LIFO)的数据结构,常用于函数调用、...
c++c++c++c++c++c++c++c++c++c++c++c++c++c++c++c++c++c++c++c++c++c++
《Visual C++6.0即学即会》是一本针对初学者和有一定编程基础的开发者设计的教程,旨在帮助读者快速掌握Visual C++6.0的使用技巧和编程概念。这本书详细介绍了Microsoft的Visual C++6.0集成开发环境(IDE),这是一...
"小学生C++学习资料集" 本资源是一个为小学生提供的C++学习资料集,涵盖了C++的基本概念、programming思想、算法设计等方面的知识点。该资源包括视频集、书籍推荐、学习群推荐等多种形式的学习资源。 C++基础知识...
本文将深入探讨C++实现多边形有效边填充算法的原理和方法。 首先,我们要理解多边形的有效边填充算法,通常基于扫描线算法。扫描线算法是一种逐行处理图像的方法,它通过在图像的水平线上移动(即扫描线)来填充...
《C++奥赛一本通教学用PPT》是专为教育者和学生设计的教学资源,旨在使C++奥林匹克竞赛的学习过程更加生动、有趣且高效。这份PPT包含了丰富的C++编程知识,涵盖了从基础语法到高级算法的全面内容,旨在帮助教师在...
C++信息学奥赛一本通PPT第一课:初识C++语言,之后会陆续上传其他PPT
《21天学通C++第8版》是一本旨在帮助初学者在短时间内掌握C++编程语言的基础知识和核心概念的教程。C++是一种强大的、通用的编程语言,以其高效性、灵活性和面向对象特性而受到广泛使用。本书通过21天的学习计划,...
《轻松学Visual C++》是一本专为初学者设计的C++编程教材,旨在帮助读者快速理解和掌握C++编程语言,并通过Visual C++集成开发环境(IDE)进行实践操作。C++是一种强大的、面向对象的编程语言,被广泛应用于系统软件...
请不要认为学过XX语言再改学C++会有什么问题 - **解读**:之前的学习经历可以帮助更快地上手,但每种语言都有其独特的特性和用法。学习C++时应将其视为一门全新的语言来对待。 #### 30. 读完了《Inside The C++ ...
《21天学会C++教程电子书》是一本旨在帮助初学者快速掌握C++编程语言的教程。C++是计算机科学领域中一种广泛使用的高级编程语言,由Bjarne Stroustrup于1979年在C语言的基础上发展而来。它以其强大的功能、高效的...
接上面Part2继续上传,学习C++的几本必看书籍,分享给大家,望大家早早受益
本资源提供了“零基础学C++”的学习资料,包括高清PDF和PPT,非常适合初学者入门。 首先,学习C++的基础部分,包括语法结构、数据类型、控制结构(如if语句、switch语句、循环)、函数、数组和指针等。这些是编程...
poco/c++开源库学习资料打包下载,通过网络收集整理,比较多 POCO_C++库学习和分析_--__跨平台库的生成.docx POCO_C++库学习和分析_--__随机数和数字摘要.docx POCO_C++库学习和分析_--_Cache.docx POCO_C++库学习和...
这是 C/C++学习指南(语法篇) 对应的视频教材! 面向零基础的初学者。同时,书中还讲解了初级程序员所必须掌握的知识和技术,如“单步调试”,“编码规范”, ANSI函数库,文件操作,标准模板库STL的使用。 学习方法:...
本文将详细讲解"多边形有效边表填充算法",以及如何在C++环境下实现这一算法,特别是在Visual Studio 2008中。 有效边表填充算法(扫描线填充算法的一种)是基于扫描线方法来处理多边形填充的。该算法的核心思想是...
对于初学者来说,解决实际问题的能力是至关重要的,因此书中可能还会提供一些小型项目或案例分析,引导读者应用所学知识。 总结来说,《易学C++》是一本全面覆盖C++基础知识的入门教程,适合没有任何编程经验或者对...
42.当你写 C++程序写到一半却发现自己用的方法很拙劣时,请不要马上停手;请尽快将余下的部分粗略的完成以保证这个设计的完整性,然后分析自己的错误并重新设计:这条建议强调了学习 C++需要不断实践和改进,遇到...