一、练习1
封装一个mystring类:
拥有私有成员:
char* p
int len
需要让以下代码编译通过,并实现对应功能:
mystring str = "hello";
mystring ptr;
ptr.copy(str);
ptr.append(str);
ptr.show(); // 输出 ptr 代表的字符串;
ptr.compare(str); // 比较 ptr 和 str 是否一样;
ptr.swap(str); // 交换 ptr 和 str 的内容;
【完整代码】如下:
#include <iostream>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>using namespace std;class mystring{
private:char* p;int len;
public:mystring();mystring(const char* str);~mystring();void copy(const mystring& r);void append(const mystring& r);void show();bool compare(const mystring& r);void swap(mystring& r);const char* data();
};mystring::mystring(){p = NULL;len = 0;
}mystring::mystring(const char* str){len = strlen(str);p = (char*)calloc(1, len+1);strcpy(p, str);
}mystring::~mystring(){if(p != NULL){free(p);}
}void mystring::copy(const mystring& r){if(p != NULL){free(p);}len = r.len;p = (char*)calloc(1, len+1);strcpy(p, r.p);
}const char* mystring::data(){return p;
}void mystring::append(const mystring& r){len = len + r.len;char* backup = p;p = (char*)calloc(1, len+1);strcpy(p, backup);strcat(p, r.p);free(backup);
}void mystring::show(){cout << p << endl;
}bool mystring::compare(const mystring& r){return strcmp(p, r.p) == 0;
}void mystring::swap(mystring& r){char* temp = p;p = r.p;r.p = temp;
}int main()
{mystring str = "hello";printf("str = %s\n", str.data());mystring ptr;ptr.copy("你好");ptr.show();ptr.append("C++");ptr.show();if(ptr.compare(str)){cout << "ptr 和 str 一样" << endl;}else{cout << "ptr 和 str 不一样" << endl;}// 交换ptr和str的内容ptr.swap(str);ptr.show();str.show();return 0;
}
二、作业1
封装一个 File 类,用有私有成员:
File* fp;
实现以下功能:
File f = "文件名"; // 要求打开该文件;
f.write(string str); // 要求将str数据写入文件中;
string str = f.read(int size); // 从文件中读取最多 size 个字节,并将读取到的数据返回;
包含:析构函数;
【完整代码】如下:
#include <iostream>
#include <string>
#include <cstring>
#include <fcntl.h>
#include <unistd.h>using namespace std;class myfile {
private:int fd; // 文件描述符public:myfile(); // 默认构造函数myfile(const char* filename); // 带参构造函数~myfile(); // 析构函数void open(const char* filename); // 打开文件void write(const string& str); // 写入文件string read(int size); // 读取文件
};// 默认构造函数
myfile::myfile() {fd = -1; // 初始化为无效文件描述符
}// 带参构造函数
myfile::myfile(const char* filename) {fd = open(filename, O_RDWR | O_CREAT | O_TRUNC, 0644); // 打开文件if (fd == -1) {cout << "文件打开失败: " << filename << endl;}
}// 析构函数
myfile::~myfile() {if (fd != -1) {close(fd); // 关闭文件}
}// 打开文件
void myfile::open(const char* filename) {if (fd != -1) {close(fd); // 如果文件已打开,先关闭}fd = open(filename, O_RDWR | O_CREAT | O_TRUNC, 0644); // 打开文件if (fd == -1) {cout << "文件打开失败: " << filename << endl;}
}// 写入文件
void myfile::write(const string& str) {if (fd == -1) {cout << "文件未打开,无法写入" << endl;return;}ssize_t bytesWritten = ::write(fd, str.c_str(), str.size()); // 写入字符串if (bytesWritten == -1) {cout << "写入文件失败" << endl;}
}// 读取文件
string myfile::read(int size) {if (fd == -1) {cout << "文件未打开,无法读取" << endl;return "";}char* buffer = (char*)calloc(1, size)); // 动态分配缓冲区if (buffer == NULL) {cout << "内存分配失败" << endl;return "";}ssize_t bytesRead = ::read(fd, buffer, size); // 读取最多 size 个字节if (bytesRead == -1) {cout << "读取文件失败" << endl;free(buffer);return "";}string result(buffer); // 将缓冲区内容转换为字符串free(buffer); // 释放缓冲区return result;
}int main() {// 测试代码myfile f = "./1.txt"; // 打开文件f.write("Hello, World!\n"); // 写入数据f.write("Hello, C++\n");string content = f.read(100); // 读取最多 100 个字节cout << "读取到的内容: " << content << endl;return 0;
}
三、练习2
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <unistd.h>
#include <sstream>
#include <vector>
#include <memory>
#include <pthread.h>using namespace std;class Mutex{
private:pthread_mutex_t m;int type;
public:Mutex(){}Mutex(int type);void init(int type);void lock();void lock(int sec);void unlock();
};Mutex::Mutex(int type):type(type)
{pthread_mutexattr_t attr;pthread_mutexattr_init(&attr);pthread_mutexattr_settype(&attr,type);pthread_mutex_init(&m,&attr);
}void Mutex::init(int type){pthread_mutexattr_t attr;pthread_mutexattr_init(&attr);pthread_mutexattr_settype(&attr,type);pthread_mutex_init(&m,&attr);
}void Mutex::lock(){pthread_mutex_lock(&m);
}void Mutex::unlock(){pthread_mutex_unlock(&m);
}int main(int argc,const char** argv){}