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);
//获得id
id=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);
//获得id
id=semget(key,num,IPC_CREAT|0666);
//初始化
for(int i=0;i<num;i++)
{
//遍历所有下标 初始化为指定值 index2
semctl(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] 信号量 为1
m[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;
}
效果