![](https://img-blog.csdnimg.cn/20201014180756930.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C/C++
文章平均质量分 68
Fremaks
这个作者很懒,什么都没留下…
展开
-
[C++ Primer] 顺序容器
1.顺序容器的初始化:a. C c; 创建一个名为c的空容器b. C c(c2); 创建容器c2的副本c,c和c2必须有相同的容器类型,并存放相同类型的元素c. C c(b, e); c 初始化为一段元素的副本,使用迭代器时不要求容器类型相同,容器内的元素类型也可以不相同,只要能将要复制的元素转换为所构建的新容器的元素类型即可。(注意允许通过内置数组中的一对指针初始化容器,因为指针其实原创 2013-09-05 00:38:12 · 604 阅读 · 0 评论 -
extern深度解析
C语言中extern用法: 对于全局变量来说,extern关键字可以在一个模块中使用在另一个模块中定义的全局变量.只要extern声明一下就好,但是变量只能定义一次,不然链接的时候会报错.(现代编译器一般采用按文件编译的方式,因此在编译时,各个文件中定义的全局变量是互相不透明的。也就是说,在编译时,全局变量的可见域限制在文件内部。但是到了链接阶段,要将各个文件的内容“合为一体”,因此,如原创 2013-08-30 09:57:18 · 956 阅读 · 0 评论 -
select,poll,epoll的区别及联系
select,poll,epoll的区别及联系int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);int poll(struct pollfd *fds, nfds_t nfds, int timeout);int epoll_wait(i原创 2014-04-19 17:59:08 · 645 阅读 · 0 评论 -
宏定义#_##的作用
宏定义中#,##的作用宏中的#的功能是将其后面的宏参数进行字符串化操作(Stringizing operator),简单说就是在它引用的宏变量的左右各加上一个双引号。如定义好#define STRING(x) #x之后,下面二条语句就等价。 char *pChar = "hello"; char *pChar = STRING(hello);还有一个#@原创 2014-06-14 09:22:23 · 1022 阅读 · 0 评论 -
长度为0的数组
看一些开源项目时经常看到如下代码:注意上面最后一行的代码,这里定义了一个长度为0的数组,这种用法可以吗?为什么可以使用长度为0 的数组?长度为的数组到底怎么使用?首先长度为0的数组在标准c和c++中是不允许的,如果使用长度为的数组,编译时会产生错误,提示数组长度不能为0。但在GNUc中,这种用法却是合法的。它的最典型的用法就是位于数组中的最后一项,如上面所示,这样做主要是为了方原创 2014-06-14 09:01:01 · 919 阅读 · 0 评论 -
命名空间
命名空间:(1)由于现在软件规模越来越大,不可避免由很多人合作开发,这样就必然会产生全局变量(函数,类等)命名冲突的问题。所以在C++等语言中引入了namespace解决这个问题。namespace允许像类,对象,函数聚集在一个名字下,从本质上来讲namespace是对全局作用域的细分,允许同名全局变量(函数,类等)的定义。例如:namespace first{ int va原创 2014-06-14 09:05:36 · 673 阅读 · 0 评论 -
字节对齐
为什么要字节对齐,用意何在? 如果一个变量的内存地址正好位于它长度的整数倍,他就被称做自然对齐。比如在32位cpu下,假设一个整型变量的地址为0x00000004,那它就是自然对齐的。需要字节对齐的根本原因在于CPU访问数据的效率问题。假设之前整型变量的地址不是自然对齐,比如为0x00000002,则CPU如果取它的值的话需要访问两次内存,第一次取从0x00000002-0x00000003原创 2014-06-14 10:49:51 · 630 阅读 · 0 评论 -
linux定时器
1.时间获取函数用于获得当前时间:*time_t time(2) / time_t (秒)* ftime(3) / struct timeb (毫秒)* gettimeofday(2) / struct timeval (微秒)* clock_gettime(2) / struct timespec (纳秒)* gmtime / localtime / timegm / mkt原创 2014-06-14 14:57:11 · 895 阅读 · 0 评论 -
字符串分割
字符串分割(1).char *strtok(char s[], const char *delim);strtok()用来将字符串分割成一个个片段。参数s指向欲分割的字符串,参数delim则为分割字符串中包含的所有字符。当strtok()在参数s的字符串中发现参数delim中包含的分割字符时,则会将该字符改为\0 字符。在第一次调用时,strtok()必需给予参数s字符串,往后的调用则将参原创 2014-06-14 15:33:29 · 997 阅读 · 0 评论 -
[C++ Primer] 面向对象编程
1.要注意区分类和类对象,对象只能访问public成员,而类和友元(当然也可以访问public成员)可以访问private成员。而对于基类的protected成员,只有派生类可以访问其基类的protected成员,不能通过派生类对象在类外访问protected成员(这点与private类似)(值得注意的是:在派生类中定义一个函数接受派生类对象的引用(指针)或者直接定义一个派生类对象,此时可以通过此原创 2013-09-12 19:19:36 · 1007 阅读 · 0 评论 -
[C++ Primer] 数组和指针
1.C++中标准库vector类似于C语言中数组的概念,当然C++中也能使用数组,但是呢C++程序应该尽量使用vector和迭代器类型,只有在设计良好的程序并强调速度时才在类实现的内部使用数组和指针。以下是部分理由:与vector类型相比,数组的缺陷在于,数组的长度是固定的,如果要更改数组的长度,程序员只能创建一个更大的数组。2.数组的定义----数组的长度必须用值大于或等于1的常量表达式定义原创 2013-09-03 00:21:54 · 1154 阅读 · 0 评论 -
[C++ Primer] 语句
1.switch表达式与case标号:case标号必须是整型常量表达式,下面的都是错误用法,case 3.14,case iavl; switch只能再最后一个case标号或default标号后定义变量。这样是为了避免出现代码跳过变量的定义和初始化的情况。如果在两个case之间定义变量,该变量会在块结束之前一直存在,对定义该变量之后的其他case标号所关联的代码都可以使用这个变量,如果sw原创 2013-09-03 00:22:34 · 986 阅读 · 0 评论 -
[C++ Primer] 函数
1.在向函数传递大型对象时,使用引用形参可以避免复制从而提高效率,而且某些类类型是无法复制的(??),当然传递指针也是可行的。如果使用引用形参唯一的目的是避免复制实参(即不需要修改实参),那么应该将形参定义为const引用,因为非const引用使用不太灵活,这样的形参使得不能使用const对象,也不能用字面值,产生右值的表达式,需要类型转换的对象作为实参。int incr(int &var)原创 2013-09-04 00:40:49 · 650 阅读 · 0 评论 -
[C++ Primer] 标准IO库
1.IO对象不可复制或赋值,由于不能复制所以流对象不能存储在vector等容器中,而且函数形参或返回类型也不能为流类型,如果需要传递或者返回IO对象,则必须传递或者返回该对象的指针或者引用。2.如果在一个循环中读取若干个文件,且打算重用已存在的流对象,那么必须在每次循环结束后关闭(close)和清空(clear)文件流。原因在于如果遇到文件结束符或者其他错误,将设置流的内部状态使得不能再对该流原创 2013-09-04 09:22:10 · 711 阅读 · 0 评论 -
[C++ Primer] 重载操作符与转换
1. 不能通过连接其他合法符号来创建任何新的操作符,例如试图定义一个operator**操作符以提供求幂操作是非法的;用于内置类型的操作符其含义不能改变,例如 int operator+(int, int)就是非法的;也不能为任何内置类型定义额外的新的操作符,例如不能定义接受两个数组类型操作数的operator+-----(数组时内置类型??)注意:重载操作符必须具有至少一个类类型或枚举原创 2013-09-12 19:27:55 · 884 阅读 · 0 评论 -
[C++ Primer] 复制控制
复制构造函数:当定义一个新对象并用一个同类型的对象对它进行初始化时,将显式使用复制构造函数 A a = A();当将该类型的对象传递给函数或从函数返回该类型的对象时,将隐式使用复制构造函数(显式使用和隐式使用的区别?)析构函数:当对象超出作用域或动态分配的对象被删除时,将自动应用析构函数。复制构造函数,赋值操作符和析构函数总称为复制控制。编译器自动实现这些操作,但类也可以定义自己的版本。原创 2013-09-10 20:17:32 · 808 阅读 · 0 评论 -
[C++ Primer] 类
1.在定义一个类之前可以声明,class Screen;这个声明就是前向声明,在程序中引入了类类型的Screen,在声明之后定义之前,Screen是一个不完全类型,即已知Screen是一个类型,但不知道包含哪些成员。我们知道定义一个类的对象会为其分配内存空间,而当Screen为不完全类型的时候,显然是不能定义Screen对象的,除此之外不完全类型只能定义指向该类的指针或者引用,或者用于声明(不是原创 2013-09-10 17:28:22 · 1090 阅读 · 0 评论 -
汉诺塔递归实现[C代码]
设有X,Y,Z三根柱子,X上开始有n个盘子1 当n=1时: 将盘子从X柱直接移到Z柱; 2 当n=2时: 首先将编号为1的盘子从X柱移到Y柱; 其次将编号为2的盘子从X柱移到Z柱; 最后将编号为1的盘子从Y柱移到Z柱;3 当n=n时: 首先将n-1个原创 2013-12-18 10:42:22 · 744 阅读 · 0 评论 -
八皇后问题
八皇后是一道很具典型性的题目。它的基本要求是这样的:在一个8*8的矩阵上面放置8个物体,一个矩阵点只允许放置一个物体,任意两个点不能在一行上,也不能在一列上,不能在一条左斜线上,当然也不能在一条右斜线上。算法思路: (1)在第n行探测某列(从0开始)是否可以放置皇后(2)如果没有可以位置可以放置皇后,返回探测其他列是否可以放置(遍历0~7列)(3)如果可以原创 2013-12-19 17:29:36 · 646 阅读 · 0 评论 -
随笔1
1.实数赋值给整型时一般都是去掉小数部分,而不是四舍五入。float a = 345.92;char b = a;printf("%d:%d\n",a,b);此时输出a是一个很大的数(是因为float在内存中存储方式与整形不同),而b则为89(345转换为16进制为0x159,超过了1个字节所以发生截断)。2.Free释放内存时传递的是一个指针,那么free是怎么知道要释放多大原创 2014-06-14 15:35:13 · 757 阅读 · 0 评论