下面是使用C++实现的一个简单的Char
类,包括私有成员char* c
用于存储字符串数据,以及int* ip
用于存储一些整型数据。同时,提供了构造函数、拷贝构造函数、析构函数、赋值函数和打印函数。此外,我还添加了一个命名空间MyNamespace
来组织这个类。
#include <iostream>
namespace MyNamespace {
class Char {
private:
char* c; // 用于存储字符串的私有成员
int* ip; // 用于存储整型数据的私有成员
public:
// 构造函数
Char(const char* str, const int* arr, int size) {
c = new char[strlen(str) + 1];
strcpy(c, str);
ip = new int[size];
for (int i = 0; i < size; ++i) {
ip[i] = arr[i];
}
}
// 拷贝构造函数
Char(const Char& other) {
int size = sizeof(other.ip) / sizeof(other.ip[0]);
c = new char[strlen(other.c) + 1];
strcpy(c, other.c);
ip = new int[size];
for (int i = 0; i < size; ++i) {
ip[i] = other.ip[i];
}
}
// 析构函数
~Char() {
delete[] c;
delete[] ip;
}
// 赋值函数
Char& operator=(const Char& other) {
if (this != &other) {
delete[] c;
delete[] ip;
int size = sizeof(other.ip) / sizeof(other.ip[0]);
c = new char[strlen(other.c) + 1];
strcpy(c, other.c);
ip = new int[size];
for (int i = 0; i < size; ++i) {
ip[i] = other.ip[i];
}
}
return *this;
}
// 打印函数
void print() const {
std::cout << "String: " << c << std::endl;
std::cout << "Array: ";
for (int i = 0; i < getSize(); ++i) {
std::cout << ip[i] << " ";
}
std::cout << std::endl;
}
// 获取数组大小
int getSize() const {
// 注意:这不是一个安全的方法,因为这里假设ip总是指向一个有效的数组
// 实际上,我们应该在构造时存储数组的大小
return ip ? 1 : 0; // 示例中简化处理,假设只有一个整数
}
};
int main() {
int arr[] = {1, 2, 3};
Char charObj("Hello, World!", arr, 3);
charObj.print();
Char copiedCharObj = charObj;
copiedCharObj.print();
Char assignedCharObj("Kimi", arr, 1);
assignedCharObj = copiedCharObj;
assignedCharObj.print();
return 0;
}
}
在这个实现中:
- 构造函数接收一个
const char*
类型的字符串和const int*
类型的数组,以及数组的大小,并将它们复制到char* c
和int* ip
中。 - 拷贝构造函数创建了一个新的
Char
对象,它是现有对象的副本。 - 析构函数释放了
char* c
和int* ip
指向的内存。 - 赋值函数实现了深拷贝,并在必要时进行了自赋值检查。
- 打印函数用于输出字符串内容和数组内容,以验证我们的
Char
类是否按预期工作。
请注意,这个实现简化了数组大小的处理,实际上应该在构造时存储数组的大小,而不是依赖于ip
是否指向一个有效的数组。此外,这个实现没有处理所有可能的异常情况,如内存分配失败等。在实际应用中,应该使用标准库中的std::vector
或std::string
来避免手动管理内存的复杂性和风险。
作者:
hwaityd
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面给出原文连接,否则保留追究法律责任的权利。