C++编码规范及专题

上传人:laiq****ong 文档编号:243072039 上传时间:2024-09-15 格式:PPT 页数:88 大小:1.65MB
返回 下载 相关 举报
C++编码规范及专题_第1页
第1页 / 共88页
C++编码规范及专题_第2页
第2页 / 共88页
C++编码规范及专题_第3页
第3页 / 共88页
点击查看更多>>
资源描述
,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,C+,培训,目录,C+,编码规范,STL,标准模板库,进程线程以及,socket,通信,Boost,库,makefile,变量名规则,变量构成方式,变量作用域,变量类型,特殊情况,命名的构成方式为,变量作用域, +,变量类型,+ ,基本名,在函数、事件等过程中例如循环中用到的临时变量可直接用,i,、,j,、,k,等形式命名变量。,其他命名规则,函数和过程,Class,(类),Structure,(结构),Interface,(,Corba,接口),常数,get_inputString(),SRatedCdr,IBusiAccept,MAX_DAY_COUNT,AILocalPlan,注释,源程序头注释,函数或过程注释,代码修改注释,其他注释,/*,Name :,cccom.xpp,Contents:,This file defines the proxy for all communication classes. Also possible,events and errors are defined.,History,:,2010/10/25 ReWe integration of missing return values,2010/10/14 Andreas Welsing #pragma pack() inserted,2010/06/13 ReWe all timers are set to -1,2009/10/25 ReWe first release,*/,/*,Parameters,: None,Return,: CCEPPFW_OK,CCEPPFW_ERROR,Description,: Close the EPP service,*/,/ begin: 2010/11/14 XXX reason is,。,/*,要删除的代码 *,/,新增的代码,/ end: 2010/11/14 XXX,char sUserName30;/ the user name,if( condition ) /your comments,目录,C+,编码规范,STL,标准模板库,进程线程以及,socket,通信,Boost,库,makefile,STL,简介,STL,是,c+,标准程序库的核心,深刻影响了标准库的整体结构,STL,是泛型程序库,利用先进、高效的算法来管理数据,STL,由一些可适应不同需求的集合类,以及在这些数据集合上操作的算法构成,STL,内的所有组件都由模板构成,其元素可以是任意类型,STL,组件,容器(,Container,) 管理某类对象的集合,迭代器(,Iterator,) 在对象集合上进行遍历,算法(,Algorithm,) 处理集合内的元素,容器,Container,容器,Container,容器,Container,算法,Algorithm,迭代器,Iterator,迭代器,Iterator,迭代器,Iterator,STL,容器类别,序列式容器排列次序取决于,插入时机和位置,关联式容器排列顺序取决于,特定准则,map,set,list,deque,vector,vector,容器,vector,模拟动态数组,vector,的元素可以是任意类型,T,,但必须具备,赋值和拷贝,能力(具有,public,拷贝构造函数和重载的赋值操作符),必须包含的头文件,#include ,vector,支持,随机存取,vector,的大小(,size,)和容量(,capacity,)通常是不同的,,capacity,返回,vector,实际能容纳的元素数量。如果超过这个数量需要重新配置内部存储器。,vector,元素操作,#include ,#include,using namespace std;,void main(),vector ivec; int x;,while(cinx) ivec.push_back(x);,for(vector:size_type i=ivec.size()-1;i!=0; i-),coutiveci “ ”;,ivec.pop_back(); ivec.pop_front();,cout“size:”ivec.size()“! last element is ”,取用,+,将迭代器前进至下一元素,=,和,!=,判断两个迭代器是否指向同一位置,=,为迭代器赋值(将所指元素的位置赋值过去),迭代器(,iterator,),所有容器都提供获得迭代器的函数,操作,效果,begin(),返回一个迭代器,指向第一个元素,end(),返回一个迭代器,指向最后一个元素之后,begin(),end(),半开区间,beg, end),的好处:,1.,为遍历元素时循环的结束时机提供了简单的判断依据(,只要未到达,end(),,循环就可以继续,),2.,不必对空区间采取特殊处理(,空区间的,begin(),就等于,end(),),迭代器(,iterator,),所有容器都提供两种迭代器,container:iterator,以“,读,/,写,”模式遍历元素,container:const_iterator,以“,只读,”模式遍历元素,迭代器示例:,iterator,begin(),end(),+,pos,vector,迭代器,(,ivec,赋值好的,vector,),vector myvec(ivec);,vector:iterator iter ;,myvec.insert(myvec.end(),-1);,myvec.insert(myvec.begin(),3,10);,for(vector:iterator iter = myvec.begin(); iter !=myvec.end(); +iter),coutiter“ “;,list,使用双向链表管理元素,list,的元素可以是任意类型,T,,但必须具备,赋值和拷贝,能力,必须包含的头文件,#include ,list,不支持随机存取,因此不提供下标操作符,在任何位置上执行元素的安插和移除都非常快。,安插和删除不会导致指向其他元素的指针、引用、,iterator,失效,stack,后进先出(,LIFO,),#include ,核心接口,push(),将元素压栈,top(),返回栈顶元素,但不移除,pop(),从栈中移除栈顶元素,但不返回,实例:,stack,stack,top(),pop(),push(),queue,先进先出(,FIFO,),#include ,核心接口,push(),将元素置入队列,front(),返回队列头部元素,但不移除,back(),返回队列尾部元素,但不移除,pop(),从栈中移除元素,但不返回,实例:,queue,queue,front(),pop(),push(),back(),STL,算法,STL,提供了一些标准算法来处理容器内的元素,搜寻、排序、拷贝、数值运算,STL,的算法是全局函数,明确划分数据和操作,泛型函数式编程模式,所有算法可以对所有容器适用,甚至可以操作不同类型容器的元素,算法头文件,#include ,#include ,STL,算法分类,非变动性算法(,nonmodifying algorithms,),变动性算法(,modifying algorithms,),移除性算法(,removing algorithms,),变序性算法(,mutating algorithms,),排序性算法(,sorting algorithms,),已序区间算法(,sorted range algorithms,),数值算法(,numeric algorithms,),for_each(),算法,for_each(InputIterator beg,InputIterator end,UnaryProc op),对区间,beg, end),中的每一个元素调用,op(elem),返回,op,之后的容器副本,op,可以改变元素,op,的返回值被忽略,复杂度:线性,与区间元素个数成正比,示例,:foreach,void show(int &element),std:cout element std:endl;,int main() ,vector ivec; int xx;,for(int i=0; ixx; ivec.push_back(xx);,std:for_each(ivec.begin(),ivec.end(),show);,IO,流库,C+,除了完全支持,C,语言的输入输出系统外,还定义了一套面向对象的输出输出系统。,为什么,C+,要建立自己的输入输出系统?,流概念,流:数据从一个对象流动到另一个对象,这种流动抽象为流。,流的操作:建立流、删除流、提取(读操作,/,输入)、插入(写操作,/,输出)。,最重要的,stream,:,istream,:定义,input stream,,用来读取数据,ostream,:定于,output stream,,用来写出数据,流类的基本结构,ios,ostream,fstream,iostream,ofstream,ifstream,clog,cerr,cout,cin,streambuf,istream,实例:分析程序结果,#include ,void main(),couta,bn;,cout.put(a).put(,).put(b).put(n);,char c1=A,c2=B;,cout.put(c1).put(c2).put(n);,结果:,a,b,a,b,AB,IO,流作业,std:cout “the sum of ” v1;, “ and ” v2;, “ is” v1+v2;, std:endl;,这段代码合法不?如果合法,为什么?反之,又为什么?,目录,C+,编码规范,STL,标准模板库,进程线程及,socket,通信,Boost,库,makefile,进程简介,进程是一个程序针对一组数据的一次执行,进程是整个系统中资源分配的最小单位,进程是系统调用的,系统处理机调度最小的单位,每个程序,(,命令,),的运行都会产生一个进程,进程由,程序,、,数据,和,进程控制块,三部分组成,进程的基本模型,主要状态有,3,种:就绪状态,运行状态,阻塞状态,挂起就绪,挂起就绪,活动阻塞,运 行,活动就绪,事件发生,激活,分派,挂起,超时,事件发生,等待事件,激活,挂起,使用,fork,系统调用,功能:创建一个新的进程,#include ,#include ,using namespace std;,int main (void) pid_t p; /* fork returns type pid_t */,p = fork();,printf(fork returned %dn, p); ,fork returned 0fork returned 698,进一步了解,fork,int main (void) ,pid_t p;,printf(Original program, pid=%dn, getpid();,p = fork();,if (p = 0) ,cout “In child process, pid= getpid() “,ppid=” getppid() endl;, else ,cout “In parent, pid=“ getpid() “, fork returned = “ p 0),wait( (int *) 0); /,父进程等待子进程的返回,else,exit(0);,Socket,简介,Socket,是进行程序间通信的,BSD,方法。,实际上是指一个通信端点,借助于它,用户所开发的,Socket,应用程序,可以通过网络与其它,Socket,应用程序进行通信。,sockets,是支持,TCP/IP,协议的网络通信的基本操作单元。可以将套接字看作不同主机间的进程进行双向通信的端点。它构成了在单个主机内及整个网际间的编程界面。,工作原理图,实例:服务端向客户端发,Hello,,,you are connected,!,Socket,地址结构定义,struct in_addr unsigned long s_addr; ,struct sockaddr,unsigned short sa_family; /,地址簇,char sa_data14; /14,字节协议地址,struct sockaddr_inshort int sin_family; /,地址簇,unsigned short,int sin_port; /,端口号,struct in_addr sin_addr; /32,位,ip,地址,unsigned char sin_zero8; /,实例,服务端,int client_fd, sin_size, sockfd;,/,创建,socket,,,bind,地址与端口,,listen,(,),省略,while(1),sin_size=sizeof(struct sockaddr_in);,if(client_fd=accept(sockfd,(struct sockaddr *)&remote_addr, &sin_size) =-1),cout“accept error”endl; continue;,if(!fork(),if(send(client_fd, ”Hello, you are connected!n”,26,0) = -1),cout“send error!”endl;,close(client_fd); exit(0);,close(client_fd);,实例,客户端,int sockfd; char buf64;,if(sockfd=socked(AF_INET,SOCK_STREAM,0)=-1),exit(1);,if(connect(sockfd,(struct in_addr *),if(recevbytes=recv(sockfd,buf,100,0)=-1),exit(1);,bufrecvbytes=“0”;,cout“Received:”bufendl;,close(sockfd);,问题,服务器向客户端发送数据时,每次都要创建一个进程,当有,N,个客户端连接服务器的时候,服务器的资源就会紧缺,致使,N+M,的客户端不能连接,或服务器拷掉,该如何改善呢?,使用线程,用线程代替进程,线程简介,线程(,thread),是进程的一个运行实体,一个,CPU,调度单位,其资源的拥有者是进程或任务。,一个进程必须包含一个线程,称为主线程。进程中的线程是并行执行的。每个线程占用,CPU,的时间由系统来划分。,线程的执行特征,基本状态:执行,就绪,挂起,就绪,阻塞,结束,执行,派生,调度,结束,阻塞,激活,进程与线程间的同步方法,临界区,互斥量,信号量,事件,在同一进程内使用,它的作用:保证只有一个线程可以申请到该对象,与临界区的作用非常相似,但它可以跨越进程使用,故它需要的资源更多,一种资源计算器,一般有初始值,表进程,/,线程可进入的数目,信号值大于零为有信号状态,用来通知其他进程,/,线程某件操作已经完成,实例,(,初始化工作是线程安全的,信号量实现,),#include ,#include boost/thread/once.h,#include ,int i = 0;,boost:once_flag flag =BOOST_ONCE_INIT;,void init()+i;,void thread()boost:call_once(,int main( int argc, char * argv),boost:thread thrd1(,boost:thread thrd2(,thrd1.join();,thrd2.join();,std:cout i std:endl;,return 0;,线程实现,socket,通讯(服务端)使用,boost,的,thread,库,int client_fd;,/,创建,socket,,,bind,地址与端口,,listen,省略,while(1),int sin_size=sizeof(struct sockaddr_in);,if(client_fd=accept(sockfd,(struct sockaddr *)&remote_addr, &sin_size) =-1),coutaccept error!endl; continue;,thread thr(bind(sendMsg,ref(client_fd);,void *sendMsg(int& client_fd),if(send(client_fd, Hello, you are connected!n,26,0) = -1),coutsend error!*fn_)();,;,R operator () (C & u) const ,return (u.*fn_)();,private:,mf_type fn_;,;,template ,mf0,mem_fn,(R (C:*fn) (),return,mf0,(fn);,template ,class,mf1,public:,typedef R (C:*mf_type) (A);,public:,explicit mf1(mf_type f) : fn_(f) ,R operator () (C * p, A a) const ,return (p-*fn_)(a);,;,R operator () (C & u, A a) const ,return (u.*fn_)(a);,private:,mf_type fn_;,;,template ,mf1,mem_fn,(R (C:*fn) (A),return,mf1,(fn);,std:for_each(v.begin(), v.end(), mem_fn(,从算法展开,一个问题,如果函数,/,仿函数有多个参数,怎么办?,对于大多数算法都只处理一个参数,并且每次有变化的也只有一个参数,使用,boost:bind,(或者,std:tr1:bind,),std:for_each(v.begin(), v.end(),boost:bind(&C:f, _1, others),);,boost:bind,boost:bind,是一个函数,返回一个仿函数,根据参数个数的不同返回不同类型的仿函数,调用方法:,boost:bind(fn, .);,_1, _2, _9,是占位符,,代表调用时传给仿函数的第,N,个参数,boost:bind,的参数是传值的,函数的第一个参数例外,可以是值也可以是指针,接下来的几个问题,boost:bind,的参数都是传值的,对于传引用的情况如何解决。,boost:refboost:cref,boost:function,采用前天提到的,any,实现的方法来实现的,主要的目的是能够减少模板的嵌套次数,boost,基础库,boost:any,boost:tuple,boost:utility,类型转换,- lexical_cast,boost:bind / boost:function,boost,其他库,日期时间库,boost:date_time,线程库,boost:thread,异步,IO,库,(socket,等,),boost:asio,智能指针,smart_ptr,正则式,boost:regex,tokenizer,随机数,boost:random,线程库, boost:thread,创建一个线程,最基本的办法,boost:thread th(FN);,利用线程池管理,boost:thread_group g;boost:thread* th = g.create_thread(FN);,线程库, boost:thread,线程操作,等待线程结束,thread:join,thread:timed_join,thread_group:join_all,交权,让,OS,调度令外的线程,thread:yield,静态函数,睡眠,thread:sleep,静态函数,线程库, boost:thread,this_thread,命名空间,普通功能,get_id,、,sleep,、,yield,at_thread_exit,中断处理,interruption_point,、,interruption_requested,、,interruption_enabled,、,disable_interruption,、,restore_interruption,线程库, boost:thread,线程间通信,锁概念,Lockable Concept,lock,、,try_lock,、,unlock,TimedLockable Concept,timed_lock,SharedLockable Concept,lock_shared,、,try_lock_shared,、,unlock_shared,、,timed_lock_shared,UpgradeLockable Concept,线程库, boost:thread,线程间通信,锁类与方法,类,lock_guard,unique_lock,shared_lock,upgrade_lock,upgrade_to_unique_lock,scoped_try_lock,仅用于,mutex,方法,lock(Lockable1,Lockable2,.),lock(begin,end),try_lock(Lockable1,Lockable2,.),try_lock(begin,end),线程库, boost:thread,线程间通信,共享控制对象,mutex,、,try_mutex,、,timed_mutex,、,recursive_mutex,、,shared_mutex,condition_variable,、,condition_variable_any,、,condition,barrier,智能指针,smart_ptr,boost:shared_ptr,tokenizer,tokenizer,这是一个容器类,类定义,tokenizer,构造函数,tokenizer(Iterator first, Iterator last,const TokenizerFunc& f = TokenizerFunc(),templatetokenizer(const Container& c,const TokenizerFunc& f = TokenizerFunc(),TokenizerFunction,char_separator,escaped_list_separator,offset_separator,boost,实现,socket,通信(服务端),try,io_service ios;,ip:tcp:acceptor acceptor(ios,ip:tcp:endpoint(ip:tcp:v4(),6688);,while(true)ip:tcp:socket sock(ios);,acceptor.accpet(sock);,sock.write_some(buffer(“hello asio!”);,catch(std:exception ,客户端,void client(io_service &ios),try,ip:tcp:socket sock(ios);,ip:tcp:endpoint ep(ip:address:from_string(“127.0.0.1”),6688);,sock.connect(ep);,vector str(100,0);,sock.read_some(buffer(str);,cout,catch(std:exception ,目录,C+,编码规范,STL,标准模板库,进程线程以及,socket,通信,Boost,库,makefile,什么是,make,?,程序的编译和链接,源程序,(.c/.cpp/.s),编译,(compile),链接,(linker),形成目标文件,语法正确、变量和函数声明正确,Windows,:,.obj,UNIX/Linux,:,.o,形成可执行程序,链接函数和全局变量,链接只关心目标文件。多个目标文件形成一个库,Windows,:,.lib,UNIX/Linux,:,.a,、,.o,Makefile,概述,makefile,定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作。,makefile,带来的好处就是,“,自动化编译”,一旦写好,只需要一个,make,命令,整个工程完全自动编译,极大的提高了软件开发的效率。,GNU,的,make,工作时的执行步骤,读入所有的,Makefile,。,读入被,include,的其它,Makefile,。,初始化文件中的变量。,推导隐晦规则,并分析所有规则。,为所有的目标文件创建依赖关系链。,根据依赖关系,决定哪些目标要重新生成。,执行生成命令。,Makefile,介绍,一个简单的,Makefile,描述规则组成:,targets : prerequisites,command,.,或是这样:,targets : prerequisites ; command,command,.,完整的,makefile,内容,显式规则,描述了在何种情况下如何更新一个或者多个被称为目标的文件。,在书写,Makefile,是需要明确地给出目标文件、目标的依赖文件列表以及更新目标文件所需要的命令。,隐含规则,是,make,根据此类目标文件的命名而自动推导出来的规则。,make,根据目标文件的名字,自动产生目标的依赖文件并使用默认的命令来对目标进行更新。,变量的定义,就是使用一个字符串代表一段文本串,当定义了变量以 后,,Makefile,后续在需要使用此文本串的地方,通过引用这个变量来实现对文本串的使用,指示符,指明在,make,程序读取,makefile,文件过程中所要执行的一个动作。包括:,1.,读取给定文件名的文件。,2.,决定(通常是根据一个变量的得值)处理或忽略,Makefile,中的某一特定部分,3.,定义一个多行变量。,注释,Makefile,中“,#”,字符后的内容被作为是注释内容,注释行的结尾如果存在反斜线(,),那么下一行也被作为注释行,当在,Makefile,中需要使用字符“,#”,时,可以使用反斜线加“,#”,(,#,)来实现,实例,Edit,使用变量,objects,= main.o kbd.o command.o display.o ,insert.o search.o files.o utils.o,edit : $(,objects,),cc -o edit $(,objects,),Make,自动推导(隐晦规则),main.o : main.c defs.h,cc -c main.c,command.o : command.c defs.h command.h,cc -c command.c,可以写成,main.o : defs.h,command.o : defs.h command.h,clean:,rm edit $(objects),更为稳健的做法是:,.PHONY : clean,clean :,-rm edit $(objects),清空目标文件的规则,大作业,写一个聊天程序,要求:,用亚信的编码规范,,socket,通信,Makefile,生成相应的目标文件(,.o,),谢谢!,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 小学资料


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!