左值和右值 左值:指表达式结束后依然存在的持久对象,可以取地址,具名变量或对象 右值:表达式结束后就不再存在的临时对象,不可以取地址,没有名字。 比如 int a = b + c;,a 就是一个左值,可以对a取地址,而b+c 就是一个右值,对表达式b+c 取地址会报错。C++11中右值又由两个概念组成:将亡值和纯右值。 纯右值和将亡值 在C++98中,右值是纯右值,纯右值指的是临时变量值、不跟对象关联的字面量值。包括非引用的函数返回值、表达式等,比如 2、‘ch’、int func()等。将亡值是C++11新增的、与右值引用相关的表达式。 纯右值:非引用返回的临时变量( int func(void) )、运算表达式产生的临时变量(b+c)、原始字面量(2)、lambda表达式等。 将亡值:将要被移动的对象、T&&函数返回值、std::move返回值和转换为T&&的类型的转换函数的返回值。 将亡值可以理解为通过“盗取”其他变量内存空间的方式获取到的值。在确保其他变量不再被使用、或即将被销毁时,通过“盗取”的方 继续阅读 >>


杜肖孟 17/08/09 21:37:30
写在前面:最级要开始写我们的项目了,是一个网络编程的项目,语言用C++,基于Socket通信,采用JSON数据交换格式,存数据用Mysql数据库。我们开始的困难是不知道如何处理客户端,组内都没有学写APP,如果是在终端下跑那就有太多限制了,感觉反而是加大了难度。 纠结了一会,突然想到能不能用PHP来写客户端,我学过一段时间PHP,目前还不太了解高阶的用法,前不久写了一个简单的订餐系统,用到一些特性,记得看到过PHP也可以进行Socket编程。在网上搜了一下,然后我写了一个简单的测试样例,客户端是用PHP,服务端用C++,互发送一条消息之后成功接收。 PHP的语言特性决定了它不适合做socket服务器端,socket主要面向底层和网络服务开发,一般用C或Java实现,能更好的处理并发、阻塞等。和C++或C写TCP客户端是一样的,工作过程可用下面的图表示: PHP中和Socket相关函数 socket_accept() 接受一个Socket连接 socket_bind() 把socket绑定在一个IP地址和端口上 sock 继续阅读 >>


杜肖孟 17/07/19 15:14:50
一、JSON的简单介绍 JSON(JavaScript Object Notation):JS对象表示法 是轻量级的文本数据交换格式;独立于语言,JSON解析器和库支持多种编程语言 json文件的文件类型是”.json” 语法规则: 数据在 名称/值对 中 名称在双引号中,后面写一个冒号,然后是值 值可以是:数字(整数或者浮点数)、string(在双引号中)、逻辑值(true/false)、数组(在[]中)、对象(在花括号中)、null,这些结构可以嵌套。 eg.数组: { "people": [ {"firstname":"jr","lastname":"smith"}, {"firstname":"palu","lastname":"george"} ] } 对象people包含两个对象的数组,每个对象是某人的姓和名,people[0].lastname返回smith 数 继续阅读 >>


杜肖孟 17/06/12 19:49:44
I/O设备分类: 按使用特性 人机交互类外设:打印机、显示器、鼠标、键盘等 存储设备:磁盘、磁带、光盘等 网络通信设备:网络接口、调制解调器等 按传输速率分类 低速设备:每秒几个到数百个字节(< KB/s),如键盘、鼠标 中速设备:每秒数千个字节至数万个字节,如激光打印机 高速设备:数百个千字节至千兆字节(>100 KB/s),如磁带机、光盘机 信息交换的单位分类 块设备:信息的存取以数据块为单位,读写的基本单位是数据块,如磁盘 字符设备:用于数据输入输出的设备为字符设备,读写的基本单位是字符,如交互式终端机、打印机 设备控制器 什么是设备控制器? 设备控制器是计算机中的一个实体,物理上看控制器是一块接口卡或主板上的一个功能模块。主要职责是控制一个或多个I/O设备,以实现CPU与I/O设备之间的数据交换。设备控制器收到命令后,CPU可以转向执行其他工作,而让设备控制器自行完成具体的I/O操作。当命令执行结束后,控制器发出一个中断信号,OS重新获得CPU控制权并检查执行结果。这样把CPU解脱出来。 设备控制器 继续阅读 >>


杜肖孟 17/06/03 14:45:34
想用C++写项目,数据库是必须的,所以这两天学了一下C++操作Mysql数据库的方法。也没有什么教程,就是在网上搜的知识,下面汇总一下。 连接MySQL数据库有两种方法:第一种是使用ADO连接,不过这种只适合Windows平台;第二种是使用MySQL自己的C API函数连接数据库。我是在Linux平台下开发,所以就采用第二种方法,有很多Api函数,但是常用的就几个,我也是就用到其中的几个。 API函数 1.mysql_real_connect() 连接一个mysql服务器 MYSQL *mysql_real_connect (MYSQL *mysql, const char *host, const char *user, const char *passwd, const char *db, unsigned int port, const char *unix_socket, unsigned long client_flag) 如果连接成功,返回MYSQL*连接句柄。如果连接失败,返回NULL。对于成功的连接,返回 继续阅读 >>


杜肖孟 17/05/28 23:28:44
进程调度的功能 记录系统中的所有进程的状态、优先级数和资源的需求情况 确定调度算法,决定将CPU分配给哪个进程多少时间 分配处理机给进程,进行CPU现场的保护和移交 调度的层次 一个作业从提交开始直到完成,往往要经历以下三级调度,如图所示。 作业调度。又称高级调度,.其主要任务是按一定的原则从外存上处于后备状态的作业中挑选一个(或多个)作业,给它(们)分配内存、输入/输出设备等必要的资源,并建立相应的进程,以使它(们)获得竞争处理机的权利。简言之,就是内存与辅存之间的调度。对于每个作业只调入一次、调出一次。 多道批处理系统中大多配有作业调度,而其他系统中通常不需要配置作业调度。作业调度的执行频率较低,通常为几分钟一次。 中级调度。又称内存调度。引入中级调度是为了提高内存利用率和系统吞吐量。为此,应使那些暂时不能运行的进程,调至外存等待,把此时的进程状态称为挂起状态。当它们已具备运行条件且内存又稍有空闲时,由中级调度来决定,把外存上的那些已具备运行条件的就绪进程,再重新调入内存,并修改其状态为就绪状态,挂在就绪队列上等待。 进程调度。又称为低 继续阅读 >>


杜肖孟 17/05/03 21:11:07
信号量S的物理含义 S>0:表示有S个资源可用;S=0表示无资源可用;S<0绝对值表示等待队列或链表中的进程个数。信号量的初值应大于等于0。 PV原语小结 通过操作信号量来处理进程间的同步与互斥的问题。其核心就是一段不可分割不可中断的程序。 信号量是由操作系统来维护的,用户进程只能通过初始化和两个标准原语(P、V原语)来访问,它们在执行时是不可中断的。初始化可指定一个非负整数,即空闲资源总数。 P原语:P是荷兰语Proberen(测试)的首字母。为阻塞原语,负责把当前进程由运行状态转换为阻塞状态,直到另外一个进程唤醒它。操作为:申请一个空闲资源(把信号量减1),则若成功,则退出;若失败,则该进程被阻塞; V原语:V是荷兰语Verhogen(增加)的首字母。为唤醒原语,负责把一个被阻塞的进程唤醒,它有一个参数表,存放着等待被唤醒的进程信息。操作为:释放一个被占用的资源(把信号量加1),如果发现有被阻塞的进程,则选择一个唤醒之。 P(S):表示申请一个资源,S减 1;若 减1 后仍S> 继续阅读 >>


杜肖孟 17/05/02 21:22:06
指针、迭代器与const的关系 1. 如果关键字出现在星号左边,表示被指物是常量;如果出现在星号右边,表示指针自身是常量;如果出现在星号两边,表示被指物和指针两者都是常量。如果被指物是常量,把 const 写在类型之前或者类型之后、星号之前是一样的。 2. 迭代器的作用就像 T* 指针,const 在迭代器前,迭代器不能改变,即声明一个 T* const 指针;const 在迭代器变量前,迭代器所指变量不能变,即声明一个 const T* 指针,需要用 const_iterator。 vector<int> vec; const vector<int>::iterator iter = vec.begin(); //iter就像个T* const *iter = 10; //right ++iter; //iter不能变 vector<int>::const_iterator cIter = vec.begin(); //cIter 继续阅读 >>


杜肖孟 17/04/30 18:04:51
预处理器、编译器、汇编、链接 预处理器(cpp) C/C++的预处理器是最低端的一种—–词法预处理器,主要是进行文本替换、宏展开、删除注释、把头文件内容包含进来这类简单工作。 gcc -E选项可得到预处理后的结果,预处理结果会显示到屏幕上,如果需要保存,则得需要重定向,扩展名为 .i; C/C++预处理不做任何语法检查,不仅是因为它不具备语法检查功能,也因为预处理命令不属于C/C++语句(这也是定义宏时不要加分号的原因),语法检查是编译器要做的事情; 预处理之后,得到的仅仅是真正的源代码,输出一个hello world都有好几百行代码; GCC确实很强大,如果是用VC这种IDE,恐怕就不能看到预处理后的结果。 编译器(ccl) 将文本文件 .i 翻译成文本文件.s,得到汇编语言程序(把高级语言翻译为机器语言),该种语言程序中的每条语句都以一种标准的文本格式确切的描述了一条低级机器语言指令。 gcc -S 选项可以得到编译后的汇编代码,扩展名为 .s; 汇编语言为不同高级语言的不同编译器提供了通用的输出语言,比如,C编译器和Fortra 继续阅读 >>


杜肖孟 17/04/30 12:28:46
视C++为一个语言联邦 今天的C++已经是个多重范型编程语言,同时支持过程形式、面向对象形式、函数形式、范型形式、元编程形式。为了理解C++,必须认识其主要的次语言,总共有四个: 1. C。C++以C为基础,语句、预处理、内置数据类型等来自C,但C没有模板、没有重载…… 2. Object-Oriented C++。面向对象C++,class、封装、继承、多态、虚函数等 3. Template C++。C++范型编程 4. STL。标准模板库,对containers、iterators、algorithms以及function objects的规约有极佳的紧密配合与协调 尽量以const,enum,inline 替换 #define 现在我们写这样一个宏定义 #define Aspect 1.653 #define 不是语言的一部分,是预处理阶段完成的,没有到编译器,因此 #define定义的记号名称也就没有进入符号表(symbol table)。当我们因为运用#define定义的常量而发生编译错误时,那么会很浪费时间来追踪它。解决方法是 继续阅读 >>


杜肖孟 17/04/29 16:23:27