C++1函数重载,类和对象,引用,/string类,vector容器,类继承,类多态,/socket,进程&信号,多线程&线程同步
Posted 码农编程录
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++1函数重载,类和对象,引用,/string类,vector容器,类继承,类多态,/socket,进程&信号,多线程&线程同步相关的知识,希望对你有一定的参考价值。
文章目录
- 1.函数重载:writetofile(),C++true和false,C0和非0
- 2.类和对象:vprintf
- 3.引用:别名
- 4.string类:string str,str=,str.c_str()
- 5.vector容器:std::vector<.>.;
- 6.类继承:class 派生类名:public 基类名
- 7.类多态:子类必重写父类纯虚函数
- 8.socket:send/recv
- 9.进程:fork(),ps -ef (同-aux) | more
- 10.信号:signal(.,EXIT),jps
- 11.多线程:pthread_create(),查看线程top -H,ps -xH | grep
1.函数重载:writetofile(),C++true和false,C0和非0
C++动态内存分配
:在C语言中,动态分配内存用malloc()函数,释放内存用free()函数。C++中new和delete。C++函数重载
:C中不允许函数同名如下:
以上为C写法,下面为C++函数重载写法。函数重载规则:1.函数名必须同
+2.参数列表必须不同
。C++是如何做到函数重载的:C++代码在编译时会根据参数列表对函数进行重命名。
2.类和对象:vprintf
上面完整,下面两行中下行是上行改进,效果一样,但没有涉及类和对象。
上面完整,下面结构体升级为类。下面为三种show声明全是类(比结构体多了函数)不涉及结构体,struct st_girl——>class CGirl。
下面为三种show函数重载实现,如下字符串理论上可定义为char name[10],但在函数里字符串也只能传地址
,所以只能定义为char * name
。char name不行,char类型是单个字符,调用时直接给字符串值。
下面为三种Show调用,调用时Girl.m_name是变量相当于&存字符串的数组名。
对象指针
:类是一种自定义的数据类型,对象也是内存变量,也有内存地址,当然也就有了类的指针。
定义指针指向这个地址,将Girl.m_name(类.属性)替换为pst->m_name。
对象作为函数的参数:与结构体一样,对象可以作为函数参数传递,最好的办法也是传递对象的地址,*必须&为ox123…
如下没有指针,pst和Girl是一样的,只是名称不同。
对象的初始化和占用内存的大小:对象不能用memset初始化,对象可用size of运算符获取占用内存大小。
面向对象编程在代码执行效率上没有任何优势,它的主要目的是方便程序员组织和管理代码。C语言是面向过程,不支持类和对象的概念。C中封装成函数,C++中多了一层封装就是类,所以C++是面向对象。
构造函数(对成员变量初始化):
CFile是类,CFile()是函数,对象没有()。
如下两个构造函数(该类对象被创建时,编译系统对象分配内存空间,并自动调用该构造函数,由构造函数完成成员的初始化工作),属于成员函数。
构造函数可以重载,一个类可以有多个构造函数。
析构函数。
3.引用:别名
C中&取地址,C++中&引用。引用就像起别名,typedef,宏define。对引用的操作与对变量直接操作完全一样。引用的声明方法:类型标识符 &引用名=目标变量名;如int a; int &ra=a;
定义了引用ra,它是变量a的引用即别名。引用可以用const修饰,表示只读,用这种方式声明的引用,不能通过引用对目标变量的值进行修改。
4.string类:string str,str=,str.c_str()
C中以0结尾的字符数组表示字符串(定义后大小不可变),C++中string随着存放字符长度自动伸缩,不用担心内存溢出
。string类是一个模板类,位于std命名空间,如果不加using namespace std;就要用std::string str
。
str[0]类似数组。
string特性描述函数:int size(); //返回当前字符串大小。int length(); //返回当前字符串的长度。void clear(); //清空字符串。string本质是一个类,通过动态分配内存实现对字符串的存储,string对象用于存放字符的内存地址是变化的。也就是地址存放的下就不再重新分配,存放不下就重新分配地址。
5.vector容器:std::vector<.>.;
vector与string类一样属于STL,容器的定义。
容器的使用:1.存放整数
访问容器中元素可以像数组形式一样。
2.存放字符串
。
3.存放结构体
,4.存放类:
存放字符串中,string就是类。
如上采用了memcpy函数(memory),它是C语言的库函数,用于内存中的数据复制,声明如下:
vector其他成员函数:1.定位的函数
2.增加元素的函数
3.删除元素的函数
4.判断容器的大小
bool empty():判断容器是否为空
int size():返回容器中元素的个数
5.作业题:封装随机数
//此程序用于生成一组随机数, 指定数组范围和是否重复
#include"_public.h"
class CRand
public:
CRand();
~CRand();
vector <int> m_val; //m_val容器
bool checkexit(const int aryyval, const int aryysize); // 用于检查是否为重复数据,aryyval为重复的值,这函数不单用,用于Rand成员函数里
void Rand(const int minvalue,const int maxvalue,bool brep=true, const int nog=5); //brep为是否允许重复; 默认为允许重复,nog指定生成多少个随机数
;
//111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
void CRand::Rand(const int minvalue,const int maxvalue,bool brep,const int nog)
int len = maxvalue-minvalue;
int ii=0, itmp=0, jtmp=0; // ii生成第几个,jtmp实际生成共多少个,itmp生成的值
m_val.clear();
if(brep==true) // 允许重复
jtmp = nog;
for(ii=0;ii<jtmp;ii++)
itmp = rand()%(len+1)+minvalue; // (0~len)+minvalue,itmp就是min~max之间的值,不是len长度
m_val.push_back(itmp);
return; //return是函数直接返回, 也就是结束该函数。
//要跳出循环用break, if代码段是不能用break跳出的, 在一个函数内任意位置调用return, 直接退出Rand函数,下面代码不执行。
jtmp = nog; // 以下为不允许重复 ,因为没进入if(brep==true)
if (nog>len) jtmp = len + 1; // 比如5-1=4,但1到5可以生成5个,所以如果nog大于len的话就取len+1个,前提不允许重复。
while(1)
if (jtmp == m_val.size()) break; //生成满了跳出循环
itmp = rand()%(len+1)+minvalue;
if (ii==0) // 生成第一个不用管checkexit重不重复
m_val.push_back(itmp);
ii++;
continue;
if (checkexit(itmp,ii) == false) continue; // checkexit为false则不允许重复
m_val.push_back(itmp); ii++;
return;
//11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
bool CRand::checkexit(const int aryyval, const int aryysize) // aryyval重复的值,aryysize允许多少个重复
for (int ii=0; ii<aryysize; ii++)
if (aryyval == m_val[ii]) return false;
return true;
CRand::~CRand()
m_val.clear();
CRand::CRand()
struct timeval begin;
gettimeofday(&begin, 0);
srand(begin.tv_usec);
//1111111111111111111111111111111111111111111111111111111111111111111111111111111111
int main() //如何用CRand这个类
CRand CrtRand;
CrtRand.Rand(0, 10, false); // 若false为true允许重复,不管范围多少取nog个
for(int ii=0;ii<CrtRand.m_val.size();ii++)
printf("%d\\n",CrtRand.m_val[ii]);
return 0;
6.类继承:class 派生类名:public 基类名
如下子类可直接用父类属性和方法。
如下倒过来就不行,基类指针pst不可访问派生类成员。
7.类多态:子类必重写父类纯虚函数
父类虚函数
与子类同名,统一都执行子类重写的show()方法,即动态多态。
纯虚函数
=0即下面没有函数实现,基类纯虚函数没有函数的具体实现,但要求派产生类必须有同名函数且有实现代码才能编译过。
下面为C++的数据抽象,其实就是用接口即成员函数调用私有的成员变量时,使用者不知道调哪个变量。
8.socket:send/recv
TCP提供了两种通信机制:流(stream)和数据报(datagram),所以套接字分为流(SOCK_STREAM指定,TCP/IP)
套接字和数据报(很少用,SOCK_DGRAM指定,UDP/IP)
套接字。如下客户端多个,服务端一个,都是tcp。
服务端:
客户端:
1.send函数。
2.recv函数。
传输结构体:
1.socket函数
如下CTcpClient::Read()没用超时机制(超时不管在客户端还是服务端都用得着)。
// 本程序演示采用CTcpClient类,实现socket通讯的客户端,demo11.cpp
#include "_public.h"
int main(int argc,char *argv[])
if (argc != 3)
printf("\\n");
printf("Using:./demo11 ip port\\n\\n");
printf("Example:./demo11 118.89.50.198 5010\\n\\n");
printf("本程序演示采用CTcpClient类,实现socket通讯的客户端。\\n\\n");
return -1;
CTcpClient TcpClient;
//111111111111111111111111111111111111111111111111111111111.向服务器发起连接
if (TcpClient.ConnectToServer(argv[1],atoi(argv[2])) == false)
printf("TcpClient.ConnectToServer(%s,%d) failed.\\n",argv[1],atoi(argv[2])); return -1;
char strRecvBuffer[1024],strSendBuffer[1024];
memset(strSendBuffer,0,sizeof(strSendBuffer));
strcpy(strSendBuffer,\\
"英超最后一轮,卡里克踢完了在曼联的最后一场正式比赛,这意味着红魔上次称霸欧冠的黄金一代全部退场。");
//11111111111111111111111111111111111111111111111111112.把strSendBuffer内容发送给服务端
if (TcpClient.Write(strSendBuffer)==false)
printf("TcpClient.Write() failed.\\n"); return -1;
printf("send ok:%s\\n",strSendBuffer);
memset(strRecvBuffer,0,sizeof(strRecvBuffer));
//1111111111111111111111111111111111111111111111111113.接收服务端返回的报文(下面Read没有超时机制)
if (TcpClient.Read(strRecvBuffer)==false)
if (TcpClient.m_btimeout==true) printf("timeout\\n");
printf("TcpClient.Read() failed.\\n"); return -1;
printf("recv ok:%s\\n",strRecvBuffer);
return 0;
// 本程序演示采用CTcpServer类,实现socket通讯的服务端,demo12.cpp
#include "_public.h"
int main(int argc,char *argv[])
if (argc != 2)
printf("\\n");
printf("Using:./demo12 port\\n\\n");
printf("Example:./demo12 5010\\n\\n");
printf("本程序演示采用CTcpServer类,实现socket通讯的服务端。\\n\\n");
return -1;
CTcpServer TcpServer;
//1111111111111111111111111111111111111111111111111111.服务端初始化
if (TcpServer.InitServer(atoi(argv[1])) == FALSE)
printf("TcpServer.InitServer(%s) failed.\\n",argv[1]); return -1;
//1111111111111111111111111111111111111111111111111112.等待客户端的连接
if (TcpServer.Accept() == FALSE)
printf("TcpServer.Accept() failed.\\n"); return -1;
char strRecvBuffer[1024],strSendBuffer[1024];
memset(strRecvBuffer,0,sizeof(strRecvBuffer));
//111111111111111111111111111111111111111111111111113.读取客户端的报文,等时间是20秒,有超时机制
if (TcpServer.Read(strRecvBuffer,20)==FALSE)
printf("TcpServer.Read() failed.\\n"); return -1;
printf("recv ok:%s\\n",strRecvBuffer);
memset(strSendBuffer,0,sizeof(strSendBuffer));
strcpy(strSendBuffer,"ok");
//111111111111111111111111111111111111111111111111114.向客户端返回响应内容
if (TcpServer.Write(strSendBuffer)==FALSE)
printf("TcpServer.Write() failed.\\n"); return -1;
printf("send ok:%s\\n",strSendBuffer);
return 0;
下面添加睡眠
即改为超时机制。
8.1 简单文件传输:CTcpClient,CTcpServer
// 本程序演示采用CTcpClient类,实现socket通讯的客户端和文件传输,demo13.cpp
#include "_public.h"
bool SendFile(int sockfd,char *filename,int filesize); //把文件的内容发送给服务端
int main(int argc,char *argv[])
if (argc != 4)
printf("\\n");
printf("Using:./demo13 ip port filename\\n\\n");
printf("Example:./demo13 118.89.50.198 5010 test1.jpg\\n\\n");
printf("本程序演示采用CTcpClient类,实现socket通讯的客户端和文件传输。\\n\\n");
return -1;
if (access(argv[3],R_OK) != 0) //判断文件是否存
printf("file %s not exist.\\n",argv[3]); return -1;
int uFileSize=0;
char strMTime[20],strRecvBuffer[1024],strSendBuffer[1024];
memset(strMTime,0,sizeof(strMTime)); //获取文件的时间和大小
以上是关于C++1函数重载,类和对象,引用,/string类,vector容器,类继承,类多态,/socket,进程&信号,多线程&线程同步的主要内容,如果未能解决你的问题,请参考以下文章
C++1函数重载,类和对象,引用,/string类,vector容器,类继承,类多态,/socket,进程&信号,多线程&线程同步