编程环境:win10,vs2017
代码 |
#pragma once #include <iostream>
//为了说明C++如何定义含有指针的类, //定义一个DsNode类,DsNode类的功能是使用一个指针,保存4种不同类型的数据。 //这四种类型是 char,short,int,longlong //转换函数(conversion function) //仿函数(function-like classes) //有指针的类,在析构时,要释放动态申请的堆内存
namespace ds08 {
using namespace std;
class DsData { private: char * data; //保存数据的首地址 size_t length; //数据的长度
private: void CreateValue(char * address, size_t len) { this->data = new char[len]; //动态申请的堆内存,用完了,要释放。 memcpy(this->data, address, len); this->length = len; }
public: //构造 析构 DsData():data(nullptr),length(0) {} DsData(const DsData& dd) { CreateValue((char *)(dd.GetData()), dd.length); }
DsData& operator = (const DsData& dd) { if (this != &dd) //dd和this不是同一个对象 { delete[] (this->data); //删除旧的data
CreateValue((char *)(dd.GetData()), dd.length); //建立新的data } return *this; }
//析构 ~DsData() { if (this->data != nullptr) { delete[] this->data; //必须显示析构数组,删除数组时,[]不能漏掉,否则会造成内存泄漏 } }
public: //其他构造 //保存 char 数据 DsData(const char& i) { if (this->data != nullptr) { delete[] this->data; } CreateValue((char *)(&i), sizeof(char)); }
//保存 short 数据 DsData(const short& i) { if (this->data != nullptr) { delete[] this->data; } CreateValue((char *)(&i), sizeof(short)); }
//保存 int 数据 DsData(const int& i) { if (this->data != nullptr) { delete[] this->data; } CreateValue((char *)(&i), sizeof(int)); }
//保存 long 数据 DsData(const long long& i) { if (this->data != nullptr) { delete[] this->data; } CreateValue((char *)(&i), sizeof(long long)); }
public: //Get Set const char * GetData() const { return this->data; }
const int& GetLength() const { return this->length; }
public : //4个转换函数 conversion function //将对象转换为数值 operator char() const { if (length == 1) { return *data; } else { return (char)0;
} }
operator short() const { if (length == 2) { return *(short *)data; } else { return (short)0;
} }
operator int() const { if (length == 4) { return *(int *)data; } else { return (int)0;
} }
operator long long() const { if (length == 8) { return *(long long *)data; } else { return (long long)0;
} }
public: /* 仿函数(function like classes) buffer : 缓冲区地址 offset : 缓冲区偏移量 isRead : true=从buffer里读数据. false=将数据写到buffer里 将数据写到buffer里,或者从buffer里读数据 */ void operator () (char * buffer, int offset, bool isRead = false) const //仿函数定义 : 第一个()是调用运算符, 此运算符被重载。第二个()是定义参数。 { if (isRead) { //从buffer里读数据 memcpy(data, buffer + offset, length); } else { //将数据写到buffer里 memcpy(buffer + offset, data, length); } }
};
//重载运算符 << ,不能在类的内部定义,只能放在类的外部定义。 std::ostream& operator << (std::ostream& out, const DsData& dd) { if (&dd != NULL) { const char * b = dd.GetData(); const char * e = b + dd.GetLength();
char buffer1[100]; snprintf(buffer1, 100, "Address=0x%08x data=address:0x%08x length:%d value:",&dd,b, dd.GetLength()); out << buffer1;
char buffer[10]; for (const char * i = b; i != e; ++i) { snprintf(buffer, 10, "0x%02x", (unsigned char) *i); out << buffer << " "; } } return out; }
//测试代码 void testDsData() { std::cout << " DsData 的长度 = " << sizeof(DsData) << std::endl;
DsData dsNull; DsData dsChar('a'); //DsData(const char& i) DsData dsShort((short)100); //DsData(const short& i) DsData dsInt(200); //DsData(const int& i) DsData dsLongLong(300LL); //DsData(const long long& i)
std::cout << endl << "构造执行结果" << endl; std::cout << "dsNull : " << dsNull << std::endl; std::cout << "dsChar : " << dsChar << std::endl; std::cout << "dsShort : " << dsShort << std::endl; std::cout << "dsInt : " << dsInt << std::endl; std::cout << "dsLongLong : " << dsLongLong << std::endl;
DsData dsCopyCtr(dsLongLong); DsData dsAssignCtr(dsLongLong);
std::cout << "dsCopyCtr : " << dsCopyCtr << std::endl; std::cout << "dsAssignCtr : " << dsAssignCtr << std::endl;
cout << endl << "转换函数执行结果" << endl; char c = dsChar; cout << "char c : " << c << endl; short s = dsShort; cout << "short s : " << s << endl; int i = dsInt; cout << "int i : " << i << endl; long long l = dsLongLong; cout << "long long l : " << l << endl; int a = 100 + (int)dsInt; cout << "int a = 100 + (int)dsInt; => " << l << endl;
std::cout << endl << "仿函数调用执行结果" << endl; char buffer[4] = {100,100,100,100}; dsInt(buffer, 0, true); //调用仿函数 std::cout << "dsInt : " << dsInt << std::endl; } } |
测试代码的输出 DsData 的长度 = 8
构造执行结果 dsNull : Address=0x00aff904 data=address:0x00000000 length:0 value: dsChar : Address=0x00aff8f4 data=address:0x00d65b80 length:1 value:0x61 dsShort : Address=0x00aff8e4 data=address:0x00d65bb0 length:2 value:0x64 0x00 dsInt : Address=0x00aff8d4 data=address:0x00d658a8 length:4 value:0xc8 0x00 0x00 0x00 dsLongLong : Address=0x00aff8c4 data=address:0x00d6f700 length:8 value:0x2c 0x01 0x00 0x00 0x00 0x00 0x00 0x00 dsCopyCtr : Address=0x00aff8b4 data=address:0x00d6f850 length:8 value:0x2c 0x01 0x00 0x00 0x00 0x00 0x00 0x00 dsAssignCtr : Address=0x00aff8a4 data=address:0x00d6f540 length:8 value:0x2c 0x01 0x00 0x00 0x00 0x00 0x00 0x00
转换函数执行结果 char c : a short s : 100 int i : 200 long long l : 300 int a = 100 + (int)dsInt; => 300
仿函数调用执行结果 dsInt : Address=0x00aff8d4 data=address:0x00d658a8 length:4 value:0x64 0x64 0x64 0x64 |