
C/C++
文章平均质量分 62
qwer_boo
这个作者很懒,什么都没留下…
展开
-
只在栈上和只在堆上申请对象
1. 只在堆上申请class A{protected: A(){} ~A(){}public: static A* create() { return new A(); } void destory() { delete this; }};构造函数和析构函数为protected,则不能直原创 2015-10-24 11:13:20 · 638 阅读 · 0 评论 -
可变参数及可变参数宏的使用
可变参数及可变参数宏的使用我们在C语言编程中会遇到一些参数个数可变的函数,例如printf()这个函数,这里将介绍可变函数的写法以及原理. * 1. 可变参数的宏一般在调试打印Debug 信息的时候, 需要可变参数的宏. 从C99开始可以使编译器标准支持可变参数宏(variadic macros), 另外GCC 也支持可变参数宏, 但是两种在细节上可能存在区别. 1. __原创 2012-02-28 11:35:00 · 674 阅读 · 0 评论 -
预处理的步骤
现在我们全面了解一下C编译器做语法解析之前的预处理步骤:1、把常量替换成相应的单字符。2、把用\字符续行的多行代码接成一行。例如:#define STR "hello, "\ "world"经过这个预处理步骤之后接成一行:#define STR "hello, " "world"这种续行的写法要求\后面紧跟换行,中间不能有其它空白字符。3、把注释(不管是单行注释还转载 2012-02-16 11:35:41 · 1328 阅读 · 1 评论 -
多态的概念和作用
多态是面向对象的重要特性,简单点说:“一个接口,多种实现”,就是同一种事物表现出的多种形态。编程其实就是一个将具体世界进行抽象化的过程,多态就是抽象化的一种体现,把一系列具体事物的共同点抽象出来, 再通过这个抽象的事物, 与不同的具体事物进行对话。 对不同类的对象发出相同的消息将会有不同的行为。比如,你的老板让所有员工在九点钟开始工作, 他只要在九点钟的时候说:“开始工作”即可,而不需要对转载 2012-02-10 09:21:39 · 1023 阅读 · 0 评论 -
枚举的取值范围
每个枚举都有取值范围,通过强制类型转换,可以将取值范围内的任何整数赋给枚举变量,即使这个值不是枚举值.例如:假设bits和Myflag的定义如下:enum bits{one = 1,two = 2,four = 4,eight};bits bit;则bit = bits(6);是合法的,其中,6不是枚举值,但它是属于枚举值范围内的. 取值范围定义如下:原创 2011-11-14 21:56:43 · 9920 阅读 · 3 评论 -
cout输出流的执行顺序
下面是IBM的一道笔试题#include using namespace std; int fun( ) { cout return 1; } int main() { int i = 1; // cout cout转载 2011-09-23 00:27:22 · 2428 阅读 · 2 评论 -
类的成员函数指针(比较深入)
From:http://blog.youkuaiyun.com/hairetz/archive/2009/05/06/4153252.aspx个人感觉对于类的成员函数指针这块讲解的比较深入详细推荐阅读////////////////////////////////////////转载 2011-08-26 12:35:09 · 684 阅读 · 0 评论 -
C++虚函数表解析(转)
声明:本文转自http://www.cppblog.com/xczhang/archive/2008/01/20/41508.html如果要转,请注明出处。 C++中的虚函数的作用主要是实现了多态的机制。关于多态,简而言之就是用父类型别的指针指向其子类的实例转载 2011-04-25 17:31:00 · 430 阅读 · 0 评论 -
不定参数的应用
不定参数的应用不定参数当年做为C/C++语言一个特长被很多人推崇,但是实际上这种技术并没有应用很多。除了格式化输出之外,我实在没看到多少应用。主要原因是这种技术比较麻烦,副作用也比较多,而一般情况下重载函数也足以替换它。尽管如此,既然大家对它比较感兴趣,我就简单总结一下它转载 2011-08-26 11:37:09 · 486 阅读 · 0 评论 -
深入探索c/c++函数(3)---虚成员函数调用的基本过程
学过c++一段时间都会知道,c++是依靠虚函数实现多态的,如下代码:view plain#include using namespace std; class Base { public: vi转载 2011-08-18 21:00:32 · 752 阅读 · 0 评论 -
深入探索c/c++函数(2)---普通成员函数调用的基本过程
c++的成员函数根据其调用的不同,大致可以分为4类:内联成员函数,静态成员函数,虚成员函数和上述3种以外的普通成员函数。从本质来说类成员函数和全局函数在调用上并没有差别,非内联函数的在调用时,基本上都包括如下的过程:函数的参数入栈,eip指针值入栈,然后跳到函数体的地址,执行函数转载 2011-08-18 20:59:18 · 1774 阅读 · 0 评论 -
深入探索c/c++函数(1)---全局函数调用的基本过程
在c/c++等许多程序设计语言中,可以将一段经常需要使用的代码封装起来,在需要使用时可以直接调用,这就是程序中的函数,函数内封装了对数据和逻辑的处理。通过函数调用来执行函数体,下面根据代码进行分析。#include using namespace std;int转载 2011-08-18 20:58:13 · 1508 阅读 · 0 评论 -
FIFO实例
命名管道客户端与服务端练习原创 2015-07-26 10:28:52 · 1002 阅读 · 0 评论 -
extern "C"解析
1.引言 C++语言的创建初衷是“a better C”,但是这并不意味着C++中类似C语言的全局变量和函数所采用的编译和连接方式与C语言完全相同。作为一种欲与C兼容的语言,C++保留了一部分过程式语言的特点(被世人称为“不彻底地面向对象”),因而它可以定义不属于任何类的全局变量和函数。但是,C++毕竟是一种面向对象的程序设计语言,为了支持函数的重载,C++对全局函数的处理方式与C有明显的转载 2015-08-24 08:13:56 · 458 阅读 · 0 评论 -
epoll之ET与LT模式
在使用epoll时,在函数 epoll_ctl中如果不设定,epoll_event 的event默认为LT(水平触发)模式。使用LT模式意味着只要fd处于可读或者可写状态,每次epoll_wait都会返回该fd,这样的话会带来很大的系统开销,且处理时候每次都需要把这些fd轮询一遍,如果fd的数量巨大,不管有没有事件发生,epoll_wait都会触发这些fd的轮询判断。转载 2015-07-20 16:45:11 · 590 阅读 · 0 评论 -
共享内存区
Posix提供了无亲缘关系进程间共享内存区的两种方法:1.内存映射文件 由open函数打开,由mmap函数把得到的描述字映射到当前进程地址空间的一个文件。#include void *mmap(void *addr, size_t len, int prot, int flags, int fd, off_t offset); addr可以指定为描述字fd应被映射到的进程内空间起原创 2015-08-21 19:37:28 · 738 阅读 · 0 评论 -
读写锁
读写锁和互斥量(互斥锁)很类似,是另一种线程同步机制,但不属于POSIX标准,可以用来同步同一进程中的各个线程。当然如果一个读写锁存放在多个进程共享的某个内存区中,那么还可以用来进行进程间的同步, 和互斥量不同的是:互斥量会把试图进入已保护的临界区的线程都阻塞;然而读写锁会视当前进入临界区的线程和请求进入临界区的线程的属性来判断是否允许线程进入。 相对互斥量只有加锁和不加锁两种状态,读原创 2015-08-21 20:00:41 · 604 阅读 · 0 评论 -
Posix信号灯
互斥锁是为上锁而优化的,条件变量是为等待而优化的,信号灯既可用用于上锁,也可用于等待,因而可能导致更多的开销和更高的复杂性。Posix.1基本原理一文给出了有了互斥锁和条件变量还提供信号灯的原因:信号灯的主要目的是提供一种进程间同步方式;这些进程可能共享内存也可能不共享内存区。互斥锁和条件变量是作为线程间的同步机制说明的,这些线程总是共享(某个)内存区。但是,互斥锁意图是用于线程同步,原创 2015-08-21 18:01:08 · 604 阅读 · 0 评论 -
linux大杂烩
1. mkdir [-mp] dirname-m 直接设置目录权限,无视umask-p 递归创建目录Rmdir –p dirname-p 若指定目录被删除后其上层目录也为空,则递归删除上层目录Rm [–rfi] dirname 用于目录不为空时-r 递归删除-f 强制删除-i 交互2. cp [-alsiru] source destinat原创 2015-09-03 22:50:37 · 1661 阅读 · 2 评论 -
select练习小结
//readwrite.h#include #include #include #include #include #include #include #include #define MAXLEN 1024struct packet{int len;char content[MAXLEN];};size_t read原创 2015-07-10 21:38:17 · 837 阅读 · 0 评论 -
System V 共享内存区
System V共享内存区在概念上类似于Posix共享内存区。代之以调用shm_open后调用mmap的是,先调用shmget,再调用shmatshmget函数创建一个尚未存在的共享内存区,或者访问一个已经存在的共享内存区。#include int shmget(key_t key, size_t size, int oflag);返回值为共享内存区的标识符。key既可以是fto原创 2015-09-01 21:04:05 · 655 阅读 · 0 评论 -
linux 线程同步、互斥
#include #include #include #include #define MAXITEMS 10000#define MAXTHREADS 20int nitems;int buf[MAXITEMS];struct{ pthread_mutex_t mutex; int nput; int nval;}put = {PTHREAD_MUTEX_INI原创 2015-08-17 11:38:16 · 481 阅读 · 0 评论 -
pipe练习(暂存)
#include #include #include #include #include #include #include #include #include #define MAXLEN 100void client(int readfd, int writefd){ size_t len; ssize_t n; char buf[MAXLEN]; fget原创 2015-07-24 18:07:51 · 554 阅读 · 0 评论 -
System V 信号灯
1.semget函数创建一个信号灯集或访问一个已存在的信号灯集#include int semget(key_t key, int nsems, int oflags);返回一个信号灯的标识符。nsems指定集合中的信号灯数,如果只是打开一个已存在的集合,则该参数指定为0.创建完一个信号灯集,就不能改变其中的信号灯数。oflags值是SEM_R和SEM_A常值的组合。也可以与IPC原创 2015-08-31 23:03:30 · 742 阅读 · 0 评论 -
相关函数(暂存)
以下所述服务既可以是十进制端口数值,也可以是ftp,http,domain等。因为不同特定服务对应不同的端口。gethostbyname函数通过查询DNS服务器用主机名来获得主机IPv4地址。#include struct hostent *gethostbyname(const char *hostname);struct hostent{char *h_name; /*o原创 2015-07-22 21:36:59 · 436 阅读 · 0 评论 -
poll之客户端与服务端聊天
poll客户端与服务端聊天原创 2015-07-18 11:52:12 · 614 阅读 · 0 评论 -
epoll处理多连接
#include #include #include #include #include #include #include #include #include #include #include #define MAXEVENTS 1024#define BUF_SIZE 100//set this descriptor non blockingstatic in转载 2015-07-20 16:25:09 · 1095 阅读 · 0 评论 -
float和double变量的内存布局~~~~~~
浮点数在c/c++以及java中的内存布局遵循IEEE标准的,首先看一下IEEE所规定的存储的方式:符号位指数位小数部分指数偏移量单精度浮点数1 位[31]8位 [30-23]23位 [22-00]127转载 2011-08-18 20:56:58 · 514 阅读 · 0 评论 -
C++虚继承内存对象模型探讨
C++虚继承内存对象模型探讨最近看了下Inside C++里面讲的对虚继承层次的对象的内存布局,发现在不同编译器实现有所区别。因此,自己动手探索了一下。结果如下:首先,说说GCC的编译器.它实现比较简单,不管是否虚继承,GCC都是将虚表指针在整个继承关系中转载 2011-09-13 00:30:11 · 1293 阅读 · 0 评论 -
模板的友元函数的使用
#include #include using namespace std;template class T>class A;template class T>void display(const A &a);template clas原创 2011-09-11 18:10:38 · 564 阅读 · 0 评论 -
浅析C++中的this指针
有下面的一个简单的类:class CNullPointCall{public: static void Test1(); void Test2(); void Test3(int iTest); void Test4();private: static int m_iStatic; int m_iTest;};int CNullPointCall::m_iStatic = 0;void CNullPointCall::Test1(){ cout }void CNul转载 2011-04-01 18:58:00 · 547 阅读 · 0 评论 -
全局变量与全局静态变量的区别
<br />全局变量与全局静态变量的区别: (a)若程序由一个源文件构成时,全局变量与全局静态变量没有区别。 (b)若程序由多个源文件构成时,全局变量与全局静态变量不同:全局静态变量使得该变量成为定义该变量的源文件所独享,即:全局静态变量对组成该程序的其它源文件是无效的。 静态全局变量的作用: (a)不必担心其它源文件使用相同变量名,彼此相互独立。 (b)在某源文件中定义的静态全局变量不能被其他源文件使用或修改。 例如:一个程序由两个源文件组成,其中在一个转载 2010-11-23 14:54:00 · 806 阅读 · 0 评论 -
在c语言中执行这两条语句printf("%d/n", 5.01);printf("%f/n", 5);
在c语言中执行这两条语句 printf("%d/n", 5.01); printf("%f/n", 5); 说这两条语句最后执行结果不是输出5和5.000000 而是输出了一个和大的数(我自己执行的是1789985710)和0.000000。 是感觉非常的不可思议。。。。。。。。 其实,在我们当我们弄清楚浮点数的存储格式之后,就会明白其中的奥妙了。 在C语言标准中,浮点数是采用IEEE754标准 float类型数据存储格式如下: 最高位最低位符号S 阶码E 尾数M 最高位 31 位 ,保存符号位转载 2010-10-25 05:00:00 · 2992 阅读 · 0 评论 -
二元运算符重载 must take either zero or one argument
<br /><br />编译报错:rmb::operator+(rmb&, rmb&)' must take either zero or one argument<br />用成员方式重载运算符, 不能改变参数的个数 <br /> 二元运算符用成员重载时, 只需要一个参数, 另一个参数由this指针传入 <br /> 所以, 像<br />rmb::operator+(rmb&, rmb&) <br /> 都要改成 <br />rmb::operator+(rmb&) <br转载 2010-12-10 07:47:00 · 4569 阅读 · 0 评论 -
如果不想使用隐式生成的函数就要显式地禁止它
<br /> <br /> 如果不想使用隐式生成的函数就要显式地禁止它<br /> <br />假设想写一个类模板Array,它所生成的类除了可以进行上下限检查外,其它行为和C++标准数组一样。设计中面临的一个问题是怎么禁止掉Array对象之间的赋值操作,因为对标准C++数组来说赋值是不合法的:<br />double values1[10];<br />double values2[10];<br />values1 = values2; // 错误!<br />对很多函数原创 2010-12-08 14:40:00 · 742 阅读 · 0 评论 -
尽量用“传引用”而不用“传值”
<br /> <br /> 尽量用“传引用”而不用“传值”<br /> <br />c语言中,什么都是通过传值来实现的,c++继承了这一传统并将它作为默认方式。除非明确指定,函数的形参总是通过“实参的拷贝”来初始化的,函数的调用者得到的也是函数返回值的拷贝。<br />正如我在本书的导言中所指出的,“通过值来传递一个对象”的具体含义是由这个对象的类的拷贝构造函数定义的。这使得传值成为一种非常昂贵的操作。例如,看下面这个(只是假想的)类的结构:<br />class person {<br />public:原创 2010-12-06 12:37:00 · 851 阅读 · 0 评论 -
让operator=返回*this的引用
<br /> <br /> 让operator=返回*this的引用<br /> <br />c++的设计者bjarne stroustrup下了很大的功夫想使用户自定义类型尽可能地和固定类型的工作方式相似。这就是为什么你可以重载运算符,写类型转换函数,控制赋值和拷贝构造函数,等等。他做了这么多努力,那你最少也该继续做下去。<br />让我们看看赋值。用固定类型的情况下,赋值操作可以象下面这样链起来:int w, x, y, z;w = x = y = z = 0;<br />所以,你也应该可以原创 2010-12-05 19:07:00 · 9334 阅读 · 2 评论 -
为需要动态分配内存的类声明一个拷贝构造函数和赋值操作符
<br /> <br /><br /><br />构造函数,析构函数和赋值操作符<br />几乎所有的类都有一个或多个构造函数,一个析构函数和一个赋值操作符。这没什么奇怪的,因为它们提供的都是一些最基本的功能。构造函数控制对象生成时的基本操作,并保证对象被初始化;析构函数摧毁一个对象并保证它被彻底清除;赋值操作符则给对象一个新的值。在这些函数上出错就会给整个类带来无尽的负面影响,所以一定要保证其正确性。本章我将指导如何用这些函数来搭建一个结构良好的类的主干。<br /><br />条款11: 为需要动态分配原创 2010-12-04 11:26:00 · 893 阅读 · 0 评论 -
ROL,ROR,SAR,SHR,SAL,SHL区别
SHL,SAL分别是逻辑左移和算术左移,运行结果是一样的,都是数据往左移动,然后在右边补零;SHR是逻辑右移,数据往右移动,在左边补零。如:1000 0000->0010 0000(逻辑右移两位)SAR是算术右移,比较特殊。他的最高位一直是不变的。如1000 0000算术右移7位后就成了1111 1111. 循环左移指令:ROL DEST,COUNT 指令功能:把目原创 2010-05-29 21:05:00 · 10931 阅读 · 0 评论 -
c++ const 用法别人小结,我学习
一、对于基本声明1.const int r=100; //标准const变量声明加初始化,因为默认内部连接所以必须被初始化,其作用域为此文件,编译器经过类型检查后直接用100在编译时替换。2.extend const int r=100; //将const改为外部连接,作用于扩大至全局,编译时会分配内存,并且可以不进行初始化,仅仅作为声明,编译器认为在程序其他地方进行了定义。3.const int原创 2010-05-21 10:07:00 · 604 阅读 · 0 评论