C++1函数重载,类和对象,引用,/string类,vector容器,类继承和多态,/socket,进程&信号

Posted 码农编程录

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++1函数重载,类和对象,引用,/string类,vector容器,类继承和多态,/socket,进程&信号相关的知识,希望对你有一定的参考价值。

文章目录


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函数重载实现,如下字符串理论上可定义为char name[10],但在函数里字符串也只能传地址,所以只能定义为char * name。char name不行,char类型是单个字符,调用时直接给字符串值。

下面为三种Show调用。

构造函数:对成员变量初始化


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

string特性描述函数:int size()返回当前字符串大小int length()返回当前字符串的长度void clear()清空字符串。string本质是一个类,通过动态分配内存实现对字符串的存储,string对象用于存放字符的内存地址是变化的。也就是地址存放的下就不再重新分配,存放不下就重新分配地址。

5.vector容器:vector与string类一样属于STL


容器的使用:1.存放整数

访问容器中元素可以像数组形式一样。


2.存放字符串

3.存放结构体4.存放类:存放字符串中,string就是类。

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基类名


如下子类可直接用父类属性和方法。


7.类多态:子类必重写父类纯虚函数




8.socket:send/recv


服务端:


客户端:



1.send函数。


2.recv函数。


1.socket函数



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)); //获取文件的时间和大小
  FileMTime(argv[3],strMTime);  
  uFileSize=FileSize(argv[3]); //获取文件的大小

  // 把文件的信息封装成一个xml报文,发送给服务端
  memset(strSendBuffer,0,sizeof(strSendBuffer));
  snprintf(strSendBuffer,100,"<filename>%s</filename><mtime>%s</mtime><size>%lu</size>",argv[3],strMTime,uFileSize);
  CTcpClient TcpClient;
  
//1111111111111111111111111111111111111111111111111111.向服务器发起连接
  if (TcpClient.ConnectToServer(argv[1],atoi(argv[2])) == false)
  
    printf("TcpClient.ConnectToServer(%s,%d) failed.\\n",argv[1],atoi(argv[2])); return -1;
  

//1111111111111111111111111111111111111111112.把文件信息的xml发送给服务端,并没有接收服务端回应,没必要,减少tcp交互次数
  if (TcpClient.Write(strSendBuffer)==false)
  
    printf("TcpClient.Write() failed.\\n"); return -1;
  
  printf("send xml:%s\\n",strSendBuffer);
  printf("send file ...");

//111111111111111111111111111111111111111111111111111113.把文件的内容发送给服务端
  if (SendFile(TcpClient.m_sockfd,argv[3],uFileSize)==false)
  
    printf("SendFile(%s) failed.\\n",argv[3]); return -1;
    
  memset(strRecvBuffer,0,sizeof(strRecvBuffer));
  
//1111111111111111111111111111111111111111111111111114.接收服务端返回的回应报文
  if (TcpClient.Read(strRecvBuffer)==false)
  
    printf("TcpClient.Read() failed.\\n"); return -1;
  
  if (strcmp(strRecvBuffer,"ok")==0)
    printf("ok.\\n");
  else
    printf("failed.\\n");
  return 0;


//111111111111111111111111111111111111111111111111113.把文件的内容发送给服务端
bool SendFile(int sockfd,char *filename,int filesize)

  int  bytes=0;
  int  total_bytes=0;
  int  onread=0;
  char buffer[1000];
  FILE *fp=NULL;
  if ( (fp=fopen(filename,"rb")) == NULL ) 
  
    printf("fopen(%s) failed.\\n",filename); return false;
  
  while (true)
  
    memset(buffer,0,sizeof(buffer));

    if ((filesize-total_bytes) > 1000) onread=1000; //一次读1000个字节
    else onread=filesize-total_bytes;
    bytes=fread(buffer,1,onread,fp); 
    if (bytes > 0)
    
      if (Writen(sockfd,buffer,bytes) == false)
      
        printf("Writen() failed.\\n"); fclose(fp); fp=NULL; return false;
      
    
    total_bytes = total_bytes + bytes;
    if ((int)total_bytes == filesize) break;
  
  fclose(fp);
  return true;

// 本程序演示采用CTcpServer类,实现socket通讯的服务端和文件传输,demo14.cpp
#include "_public.h"
bool RecvFile(char *strRecvBuffer,int sockfd,char *strfilename); //接收文件的内容
int main(int argc,char *argv[])

  if (argc != 3)
  
    printf("\\n");
    printf("Using:./demo14 port filename\\n\\n");
    printf("Example:./demo14 5010 test2.jpg\\n\\n"); //test2.jpg重新命名
    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;
  
  
//11111111111111111111111111111111111111111113.读取客户端的报文,等时间是20秒
  char strRecvBuffer[1024],strSendBuffer[1024];
  memset(strRecvBuffer,0,sizeof(strRecvBuffer));
  if (TcpServer.Read(strRecvBuffer,20)==false) 
  
    printf("TcpServer.Read() failed.\\n"); return -1;
  
  printf("recv:%s\\n",strRecvBuffer);
  printf("recv file ...");

//111111111111111111111111111111111111111111114.接收文件的内容
  memset(strSendBuffer,0,sizeof(strSendBuffer));
  if (RecvFile(strRecvBuffer,TcpServer.m_connfd,argv[2])==true)
  
    strcpy(strSendBuffer,"ok");
    printf("ok.\\n");
  
  else
  
    strcpy(strSendBuffer,"failed");
    printf("failed.\\n");
  

//1111111111111111111111111111111111111111111111111115.接收ok后,向客户端返回响应内容
  if (TcpServer.Write(strSendBuffer)==false) 
  
    printf("TcpServer.Write() failed.\\n"); return -1;
  
  printf("send:%s\\n",strSendBuffer);
  return 0;


//1111111111111111111111111111111111111111111111111114.接收文件的内容
bool RecvFile(char *strRecvBuffer,int sockfd,char *strfilename)

  int  ufilesize=0;
  char strmtime[20]; 
  memset(strmtime,0,sizeof(strmtime));
  // 获取待接收的文件的时间和大小
  GetXMLBuffer(strRecvBuffer,"mtime",strmtime);
  GetXMLBuffer(strRecvBuffer,"size",&ufilesize);
  
  FILE *fp=NULL;
  if ( (fp=fopen(strfilename,"wb")) ==NULL)
  
 

以上是关于C++1函数重载,类和对象,引用,/string类,vector容器,类继承和多态,/socket,进程&信号的主要内容,如果未能解决你的问题,请参考以下文章

C++1函数重载,类和对象,引用,/string类,vector容器,类继承,类多态,/socket,进程&信号,多线程&线程同步

类和对象——补充(运算符重载,static和explicit关键字和友元,内部类)

C++类和对象

C++入门(类和对象一篇通)

Java入门系列-14-深入类和对象

C++核心技术个人笔记