C++ DAY3
作业
代码
/*********************************** 声明部分 ***********************************/
class mystring
{
private:char* arr; int len;
public://构造函数mystring(const char* str=NULL);//拷贝构造// mystring(const mystring& str) = delete;~mystring();// 重载=mystring& operator=(const mystring& index);// 重载+mystring operator+(const mystring& index);// 重载+=mystring& operator+=(const mystring& index);// 重载[]char& operator[](const int& index);//成员方法void show()const;
};/********************************* main主函数 *********************************/
int main(int argc,const char** argv)
{mystring str="hello";mystring temp="new";mystring ptr="world";// 连续相加 测试ptr=str + " " + temp + " " + ptr;ptr.show();// 连续相等 测试ptr = str = temp;ptr.show();str.show();temp.show();// 测试 += 的效果str+= ( ptr + temp );str.show();// 指定修改第 i 位for(int i=0;i<9;i++){str[i]='O';}str.show();return 0;
}/******************************** 类的 成员方法 ********************************/
//构造函数
mystring::mystring(const char* str):arr(NULL),len(0)
{if(str!=NULL){len=strlen(str)+1; //获取数据长度arr = new char[len]; //申请动态内存strcpy(arr,str); //进行数据拷贝}
}
//析构函数
mystring::~mystring()
{if(arr!=NULL){delete[] arr;arr=NULL;}
}
//显示
void mystring::show()
const
{cout << ( arr==NULL? "(null)":arr )<<endl;
}//重载 =
mystring& mystring::operator=(const mystring& index)
{if(this!=&index){//释放旧空间delete[] arr;//获取新数据长度len=index.len;//申请新空间arr=new char[len];//数据写入到新空间strcpy(arr,index.arr);}// 由于存在 "连续等于" 情况, a=b=c // 所以 = 有返回值,返回自身return *this;
}
//重载 +=
mystring& mystring::operator+=(const mystring& index)
{//备份旧空间地址char* temp=arr;//新空间需要的大小len+=index.len-1;//申请新空间arr=new char[len+1];//数据写入到新空间strcpy(arr,temp);strcat(arr,index.arr);//释放旧空间delete[] temp;// 由于 if( index += 5 == 5){} 这种语法符合规则 // 说明 += 也有返回值 , 返回 += 后结果return *this;
}//重载 +
mystring mystring::operator+(const mystring& index)
{//计算 相加后的字符串 长度int newStrlen = len + index.len-1;//字符数组,用于存放相加后的字符串char newStr[newStrlen]; //数据写入到数组strcpy(newStr,arr);strcat(newStr,index.arr);//创建类mystring sum = newStr;//返回类//由于生命周期不够长 , 不返回引用return sum;
}//重载 []
char& mystring::operator[](const int& index)
{return arr[index];
}
效果
作业
测试逻辑
程序A 向指定频道 写入数据
程序B去指定频道 读取数据
代码
发送端代码
class Msg
{
private:long channel; //频道号char buf[128]; //指向消息key_t key;int id;
public:Msg(const char* filename=NULL):channel(-1),buf(""),key(-1),id(-1){//如果没有传入文件名.则退出if(NULL==filename){return;}//如果文件不存在,则创建,不打开open(filename,O_EXCL|O_CREAT,0666);//生成密钥key=ftok(filename,1);//获得idid=msgget(key,IPC_CREAT|0666);}void send(const char* str){strcpy(buf,str);msgsnd(id,this,strlen(buf),IPC_NOWAIT);}char* read(){memset(buf,0,128);msgrcv(id,this,128,channel,0);return buf;}// 重载[]Msg& operator[](const int& index){channel=index;return *this;}
};int main(int argc,const char** argv)
{Msg m("IPC");m[4].send("数据");return 0;
}
读取端代码
int main(int argc,const char** argv)
{Msg m("IPC");string str=m[4].read();cout<<str<<endl;return 0;
}
效果
作业
测试
程序A 拿走一个信号量 输出一个数据
程序B 终端有输入,则释放一个信号量
代码
【main1.c】 每次拿走一个信号量,就输出一个数据
class Sem
{
private:int index; //记录信号灯集总数int index_op; //将对那个下标操作key_t key;int id;
public:Sem(const int& num,const int& index_value):key(-1),id(-1),index(num),index_op(-1){//如果文件不存在,则创建,不打开open("IPC",O_EXCL|O_CREAT,0666);//生成密钥key=ftok("IPC",2);//获得idid=semget(key,num,IPC_CREAT|0666);//初始化for(int i=0;i<num;i++){//遍历所有下标 初始化为指定值 index2semctl(id,i,SETVAL,index_value);}}//手动设置指定下标的值void init(const int& index){semctl(id,index_op,SETVAL,index);}// 重载[]Sem& operator[](const int& index){//说明选中第 i 个index_op=index;return *this;}//重载 +Sem& operator+(const int& index){struct sembuf sop;sop.sem_num=index_op; //选中下标sop.sem_op=index; //解锁 index 次sop.sem_flg=SEM_UNDO; //自动销毁//执行依次上述设定的操作semop(id,&sop,1);return *this;}//重载 -Sem& operator-(const int& index){struct sembuf sop;sop.sem_num=index_op; //选中下标sop.sem_op=-index; //上锁 index 次sop.sem_flg=SEM_UNDO; //自动销毁//执行依次上述设定的操作semop(id,&sop,1);return *this;}
};int main(int argc,const char** argv)
{//创建信号灯集Sem m(5,0);//手动设定 [下标1] 信号量 为1m[1].init(1);string str[5]={"你","好","新","世","界"};for(int i=0;i<5;i++){m[1]-1; //拿走 [下标1] 上的一个信号量cout<<str[i]<<endl; //输出内容}return 0;
}
【main2.c】 终端有输入就释放一个信号量
int main(int argc,const char** argv)
{ while(1){//如果从终端吃到回车while(getchar()!=10);//就释放一个信号量m[1]+1;}return 0;
}
效果