如何为数据结构的学习选择合适的语言?
支持泛型编程的语言最适合数据结构课程的学习?
与下一个实验在一起。
- #include <iostream>
-
- using namespace std;
-
- template <typename T>
- void Swap(T& a, T& b)
- {
- T t = a;
- a = b;
- b = t;
- }
-
- template <typename T>
- class Op
- {
- public:
- T process(T v)
- {
- return v * v;
- }
- };
-
- int main()
- {
- int a = 2;
- int b = 1;
-
- Swap(a, b);
-
- cout << "a = " << a << " " << "b = " << b << endl;
-
- double c = 0.01;
- double d = 0.02;
-
- Swap<double>(d, c);
-
- cout << "c = " << c << " " << "d = " << d << endl;
-
- Op<int> opInt;
- Op<double> opDouble;
-
- cout << "5 * 5 = " << opInt.process(5) << endl;
- cout << "0.3 * 0.3 = " << opDouble.process(0.3) << endl;
-
- return 0;
- }
SmartPointer.h
- #ifndef SMARTPOINTER_H_
- #define SMARTPOINTER_H_
- /*******************************************************************************
- * Include Files *
- *******************************************************************************/
- #include "Pointer.h"
- /*******************************************************************************
- * Type Definition *
- *******************************************************************************/
- namespace DTLib
- {
-
- template <typename T> // 泛型编程 - 类模板
- class SmartPointer : public Pointer<T> // 基于普通指针类
- {
- public:
- SmartPointer(T* p = NULL) : Pointer<T>(p) // 构造函数 - 调用父类构造函数 - 默认指针为NULL
- {
-
- }
-
- SmartPointer(const SmartPointer<T>& obj) // 拷贝构造函数
- {
- this->m_pointer = obj.m_pointer; // 当前对象的堆空间 指向 引入的堆空间
-
- const_cast<SmartPointer<T>&>(obj).m_pointer = NULL; // 将原来的堆空间指针置NULL const_cast 去除对象的const属性
- }
-
- SmartPointer<T>& operator= (const SmartPointer<T>& obj) // 重载赋值操作符
- {
- if( this != &obj ) // 判断是否为 自赋值
- {
- T* p = this->m_pointer; //为了防止类异常抛出,所以最后释放堆空间
-
- this->m_pointer = obj.m_pointer; // 当前对象的堆空间 指向 引入的堆空间
-
- const_cast<SmartPointer<T>&>(obj).m_pointer = NULL; // 将原来的堆空间指针置NULL const_cast 去除对象的const属性
-
- delete p; // 释放当前指针指向的堆空间
- }
-
- return *this; // 返回自己(支持连续赋值)
- }
-
- ~SmartPointer() // 析构函数 - 释放智能指针对应的堆空间
- {
- delete this->m_pointer;
- }
- };
-
- }
-
- #endif // SMARTPOINTER_H_
Pointer.h
- #ifndef POINTER_H_
- #define POINTER_H_
- /*******************************************************************************
- * Include Files *
- *******************************************************************************/
- #include "Object.h"
- /*******************************************************************************
- * Type Definition *
- *******************************************************************************/
- namespace DTLib
- {
-
- template < typename T > // 泛型编程 - 类模板 T
- class Pointer : public Object
- {
- protected: // protected 可以被子类直接访问; 不能被外界直接访问
- T* m_pointer;
- public:
- Pointer(T* p = NULL) // 构造函数 - 默认指针为NULL
- {
- m_pointer = p;
- }
-
- T* operator-> () // 重载 -> 返回指针地址
- {
- return m_pointer;
- }
-
- T& operator* () // 重载 * 返回值
- {
- return *m_pointer;
- }
-
- const T* operator-> () const // 重载 -> 返回指针地址 const对象只能调用const的成员函数
- {
- return m_pointer;
- }
-
- const T& operator* () const // 重载 * 返回值 const对象只能调用const的成员函数
- {
- return *m_pointer;
- }
-
- bool isNull() const // 判断当前的智能指针是否为空指针 const对象只能调用const的成员函数
- {
- return (m_pointer == NULL);
- }
-
- T* get() const // 获取智能指针的值 const对象只能调用const的成员函数
- {
- return m_pointer;
- }
-
- virtual ~Pointer() = 0; // 析构函数 纯虚函数(抽象类)
- };
-
- template < typename T >
- Pointer<T>::~Pointer()
- {
-
- }
-
- }
-
- #endif // POINTER_H_
智能指针的使用军规:只能用来指向堆空间中的单个对象或者变量
- #include <iostream>
-
- using namespace std;
-
- double divide(double a, double b)
- {
- const double delta = 0.000000000000001;
- double ret = 0;
-
- if( !((-delta < b) && (b < delta)) ) {
- ret = a / b;
- }
- else {
- throw 0; // 产生除 0 异常
- }
-
- return ret;
- }
-
- void Demo1()
- {
- try
- {
- throw 'c';
- }
- catch(int i)
- {
- cout << "catch(int i)" << endl;
- }
- catch(double d)
- {
- cout << "catch(double d)" << endl;
- }
- catch(char c)
- {
- cout << "catch(char c)" << endl;
- }
- }
-
- void Demo2()
- {
- throw 0.0001; // "D.T.Software"; // const char*
- }
-
- int main()
- {
- cout << "main() begin" << endl;
-
- try
- {
- double c = divide(1, 1);
-
- cout << "c = " << c << endl;
- }
- catch(...)
- {
- cout << "Divided by zero..." << endl;
- }
-
- Demo1();
-
- try
- {
- Demo2();
- }
- catch(char* c)
- {
- cout << "catch(char* c)" << endl;
- }
- catch(const char* cc)
- {
- cout << "catch(char* cc)" << endl;
- }
- catch(...)
- {
- cout << "catch(...)" << endl;
- }
-
- cout << "main() end" << endl;
-
- return 0;
- }
Exception.cpp
- /*******************************************************************************
- * Include _Files *
- *******************************************************************************/
- #include "Exception.h"
- #include <cstring>
- #include <cstdlib>
- #include <cstdio>
-
- using namespace std;
- /*******************************************************************************
- * Type Definition *
- *******************************************************************************/
- namespace DTLib
- {
- /**********************************************************************
- * Function: Exception::init()
- * Description: 辅助初始化函数
- * Table Accessed:
- * Table Updated:
- * Input: _message 异常的说明信息
- * _file 发生异常的文件名
- * _line 发生异常的行号
- * Output: m_message 异常的说明信息 (类中成员)
- * m_location 异常的文件名和行号 (类中成员)
- * Return:
- * Others: 用于被重载函数调用
- * Modify Date Version Author Modification
- * ------------------------------------------------------------
- * 2022/03/09 1.0 Create
- **********************************************************************/
- void Exception::init(const char* _message, const char* _file, int _line)
- {
- #define STR_CAT_LINE 16 // 行号字符串拼接长度
- #define STR_CAT_SYMBOL 2 // 文件名和行号的隔离符号(:); 字符串结束符\0
-
- // 获取 异常的说明信息
- m_message = (_message ? strdup(_message) : NULL); //判断_message是否为空(strdup默认入参不为空) strdup将字符串复制到堆空间,返回指针地址
-
- // 获取 发生异常的文件名和行号
- if( _file != NULL )
- {
- // 将行号转为字符串类型
- char acLineStrcat[STR_CAT_LINE] = {0};
- // itoa(_line, acLineStrcat, 10);
- snprintf(acLineStrcat, sizeof(acLineStrcat), "%d", _line);
-
- // 申请堆空间,进行拼接文件名和行号
- m_location = static_cast<char*>(malloc(strlen(_file) + strlen(acLineStrcat) + STR_CAT_SYMBOL));
- if( m_location != NULL )
- {
- m_location = strcpy(m_location, _file); // 拷贝文件名
- m_location = strcat(m_location, ":"); // 拼接 :
- m_location = strcat(m_location, acLineStrcat); // 拼接 行号
- }
- }
- else
- {
- m_location = NULL;
- }
- }
-
- /**********************************************************************
- * Function: Exception::Exception()
- * Description: 重载函数
- * Input: _message 异常的说明信息
- * _file 发生异常的文件名
- * _line 发生异常的行号
- * Others: 用于被重载函数调用
- * Modify Date Version Author Modification
- * ------------------------------------------------------------
- * 2022/03/09 1.0 Create
- **********************************************************************/
- Exception::Exception(const char* _message)
- {
- init(_message, NULL, 0);
- }
-
- Exception::Exception(const char* _file, int _line)
- {
- init(NULL, _file, _line);
- }
-
- Exception::Exception(const char* _message, const char* _file, int _line)
- {
- init(_message, _file, _line);
- }
-
- /**********************************************************************
- * Function: Exception::Exception()
- * Description: 拷贝函数重载(深拷贝)
- * Input: Exception 传入待拷贝的Exception类
- * Output: Exception 创建的Exception类 (类中成员)
- * Return:
- * Others: 深拷贝 - 成员指向了动态内存空间
- * Modify Date Version Author Modification
- * ------------------------------------------------------------
- * 2022/03/09 1.0 Create
- **********************************************************************/
- Exception::Exception(const Exception& _eWaitCopy)
- {
- m_message = strdup(_eWaitCopy.m_message);
- m_location = strdup(_eWaitCopy.m_location);
- }
-
- /**********************************************************************
- * Function: Exception::Exception()
- * Description: 赋值运算符重载
- * Input: Exception 传入待拷贝的Exception类
- * Output: Exception 创建的Exception类 (类中成员)
- * Return: Exception 当前类的指针
- * Others: 返回当前类的指针,代表允许连续赋值
- * Modify Date Version Author Modification
- * ------------------------------------------------------------
- * 2022/03/09 1.0 Create
- **********************************************************************/
- Exception& Exception::operator= (const Exception& _eWaitCopy)
- {
- if( this != &_eWaitCopy )
- {
- free(m_message);
- free(m_location);
-
- m_message = strdup(_eWaitCopy.m_message);
- m_location = strdup(_eWaitCopy.m_location);
- }
-
- return *this;
- }
-
- /**********************************************************************
- * Function: Exception::message()
- * Description: 返回异常的说明信息的指针
- * Input:
- * Output:
- * Return: char* m_message 返回异常的说明信息的指针
- * Others:
- * Modify Date Version Author Modification
- * ------------------------------------------------------------
- * 2022/03/09 1.0 Create
- **********************************************************************/
- const char* Exception::message() const
- {
- return m_message;
- }
-
- /**********************************************************************
- * Function: Exception::location()
- * Description: 返回异常文件名和行号的指针
- * Input:
- * Output:
- * Return: char* m_location 返回异常文件名和行号的指针
- * Others:
- * Modify Date Version Author Modification
- * ------------------------------------------------------------
- * 2022/03/09 1.0 Create
- **********************************************************************/
- const char* Exception::location() const
- {
- return m_location;
- }
-
- /**********************************************************************
- * Function: Exception::~Exception()
- * Description: 析构函数
- * Input:
- * Output:
- * Return:
- * Others: 纯虚函数(抽象类) - 纯虚函数的实现由子类完成,这里是个例外,但凡定义析构函数就必须要提供实现,不管是不是纯虚的.
- * Modify Date Version Author Modification
- * ------------------------------------------------------------
- * 2022/03/09 1.0 Create
- **********************************************************************/
- Exception::~Exception()
- {
- free(m_message);
- free(m_location);
- }
-
- }
Exception.h
- #ifndef EXCEPTION_H_
- #define EXCEPTION_H_
- /*******************************************************************************
- * Include Files *
- *******************************************************************************/
- #include "Object.h"
-
- /*******************************************************************************
- * Type Definition *
- *******************************************************************************/
- namespace DTLib
- {
- #define THROW_EXCEPTION(e, m) (throw e(m, __FILE__, __LINE__)) // 异常类型;说明信息
-
- /****** 异常父类 ******/
- class Exception : public Object
- {
- protected:
- char* m_message; // 当前异常的说明信息
- char* m_location; // 当前异常的位置信息
-
- void init(const char* _message, const char* _file, int _line); // 辅助初始化 - 定义了多个重载函数
- public:
- Exception(const char* message); // 构造函数 - 重载函数
- Exception(const char* file, int line); // 构造函数 - 重载函数
- Exception(const char* message, const char* file, int line); // 构造函数 - 重载函数
-
- Exception(const Exception& _eWaitCopy); // 拷贝构造函数
- Exception& operator= (const Exception& _eWaitCopy); // 赋值构造函数
-
- virtual const char* message() const; // 异常对象的说明信息
- virtual const char* location() const; // 异常对象的位置信息
-
- virtual ~Exception() = 0; // 纯虚函数(抽象类) - 析构函数
- };
-
- /****** 计算异常子类 ******/
- class ArithmeticException : public Exception
- {
- public:
- // 显式调用父类构造函数
- ArithmeticException() : Exception(0) { }
- ArithmeticException(const char* message) : Exception(message) { }
- ArithmeticException(const char* file, int line) : Exception(file, line) { }
- ArithmeticException(const char* message, const char* file, int line) : Exception(message, file, line) { }
-
- // 显式调用父类拷贝构造函数
- ArithmeticException(const ArithmeticException& eWaitCopy) : Exception(eWaitCopy) { }
- // 调用父类赋值重载函数
- ArithmeticException& operator= (const ArithmeticException& eWaitCopy)
- {
- Exception::operator=(eWaitCopy);
-
- return *this;
- }
- };
-
- /****** 空指针异常子类 ******/
- class NullPointerException : public Exception
- {
- public:
- // 显式调用父类构造函数
- NullPointerException() : Exception(0) { }
- NullPointerException(const char* message) : Exception(message) { }
- NullPointerException(const char* file, int line) : Exception(file, line) { }
- NullPointerException(const char* message, const char* file, int line) : Exception(message, file, line) { }
-
- // 显式调用父类拷贝构造函数
- NullPointerException(const NullPointerException& eWaitCopy) : Exception(eWaitCopy) { }
- // 调用父类赋值重载函数
- NullPointerException& operator= (const NullPointerException& eWaitCopy)
- {
- Exception::operator=(eWaitCopy);
-
- return *this;
- }
- };
-
- /****** 越界异常子类 ******/
- class IndexOutOfBoundsException : public Exception
- {
- public:
- // 显式调用父类构造函数
- IndexOutOfBoundsException() : Exception(0) { }
- IndexOutOfBoundsException(const char* message) : Exception(message) { }
- IndexOutOfBoundsException(const char* file, int line) : Exception(file, line) { }
- IndexOutOfBoundsException(const char* message, const char* file, int line) : Exception(message, file, line) { }
-
- // 显式调用父类拷贝构造函数
- IndexOutOfBoundsException(const IndexOutOfBoundsException& eWaitCopy) : Exception(eWaitCopy) { }
- // 调用父类赋值重载函数
- IndexOutOfBoundsException& operator= (const IndexOutOfBoundsException& eWaitCopy)
- {
- Exception::operator=(eWaitCopy);
-
- return *this;
- }
- };
-
- /****** 内存不足异常子类 ******/
- class NoEnoughMemoryException : public Exception
- {
- public:
- // 显式调用父类构造函数
- NoEnoughMemoryException() : Exception(0) { }
- NoEnoughMemoryException(const char* message) : Exception(message) { }
- NoEnoughMemoryException(const char* file, int line) : Exception(file, line) { }
- NoEnoughMemoryException(const char* message, const char* file, int line) : Exception(message, file, line) { }
-
- // 显式调用父类拷贝构造函数
- NoEnoughMemoryException(const NoEnoughMemoryException& eWaitCopy) : Exception(eWaitCopy) { }
- // 调用父类赋值重载函数
- NoEnoughMemoryException& operator= (const NoEnoughMemoryException& eWaitCopy)
- {
- Exception::operator=(eWaitCopy);
-
- return *this;
- }
- };
-
- /****** 参数错误异常子类 ******/
- class InvalidParameterException : public Exception
- {
- public:
- // 显式调用父类构造函数
- InvalidParameterException() : Exception(0) { }
- InvalidParameterException(const char* message) : Exception(message) { }
- InvalidParameterException(const char* file, int line) : Exception(file, line) { }
- InvalidParameterException(const char* message, const char* file, int line) : Exception(message, file, line) { }
-
- // 显式调用父类拷贝构造函数
- InvalidParameterException(const InvalidParameterException& eWaitCopy) : Exception(eWaitCopy) { }
- // 调用父类赋值重载函数
- InvalidParameterException& operator= (const InvalidParameterException& eWaitCopy)
- {
- Exception::operator=(eWaitCopy);
-
- return *this;
- }
- };
-
- /****** 成员函数调用异常子类 ******/
- class InvalidOperationException : public Exception
- {
- public:
- // 显式调用父类构造函数
- InvalidOperationException() : Exception(0) { }
- InvalidOperationException(const char* message) : Exception(message) { }
- InvalidOperationException(const char* file, int line) : Exception(file, line) { }
- InvalidOperationException(const char* message, const char* file, int line) : Exception(message, file, line) { }
-
- // 显式调用父类拷贝构造函数
- InvalidOperationException(const InvalidOperationException& eWaitCopy) : Exception(eWaitCopy) { }
- // 调用父类赋值重载函数
- InvalidOperationException& operator= (const InvalidOperationException& eWaitCopy)
- {
- Exception::operator=(eWaitCopy);
-
- return *this;
- }
- };
-
- }
-
- #endif // EXCEPTION_H_
在可复用代码库设计时,尽量使用面向对象技术进行架构,尽量使用异常处理机制分离正常逻辑和异常逻辑。
new操作如果失败会发生什么?
Object.h
- #ifndef OBJECT_H_
- #define OBJECT_H_
- /*******************************************************************************
- * Include _Files *
- *******************************************************************************/
- #include <cstdlib>
- /*******************************************************************************
- * Type Definition *
- *******************************************************************************/
- namespace DTLib
- {
-
- class Object
- {
- public:
- void* operator new (size_t size) throw(); // 重载 new
- void operator delete (void* p); // 重载 delete
- void* operator new[] (size_t size) throw(); // 重载 new[]
- void operator delete[] (void* p); // 重载 delete[]
- bool operator == (const Object& obj); // 重载 == 自定义类可能会出现比较操作符,此处为默认写法 - 判断地址是否相同
- bool operator != (const Object& obj); // 重载 != 自定义类可能会出现比较操作符,此处为默认写法 - 判断地址是否相同
- virtual ~Object() = 0; // 析构函数(纯虚函数 抽象类)
- };
-
-
- }
-
- #endif // OBJECT_H_
Object.cpp
- /*******************************************************************************
- * Include _Files *
- *******************************************************************************/
- #include "Object.h"
- #include <cstdlib>
- /*******************************************************************************
- * Type Definition *
- *******************************************************************************/
- using namespace std;
-
- namespace DTLib
- {
-
- /**********************************************************************
- * Function: Object::operator new()
- * Description: 重载 new
- * Table Accessed:
- * Table Updated:
- * Input: size 字节大小
- * Output: void* 指针地址
- * Return:
- * Others: throw() 这个重载函数不会抛出任何异常
- * Modify Date Version Author Modification
- * ------------------------------------------------------------
- * 2022/03/09 1.0 Create
- **********************************************************************/
- void* Object::operator new (size_t size) throw()
- {
- return malloc(size);
- }
-
- /**********************************************************************
- * Function: Object::operator delete()
- * Description: 重载 delete
- * Table Accessed:
- * Table Updated:
- * Input: void* 指针地址
- * Output:
- * Return:
- * Others:
- * Modify Date Version Author Modification
- * ------------------------------------------------------------
- * 2022/03/09 1.0 Create
- **********************************************************************/
- void Object::operator delete (void* p)
- {
- free(p);
- }
-
- /**********************************************************************
- * Function: Object::operator new[]()
- * Description: 重载 new[](数组)
- * Table Accessed:
- * Table Updated:
- * Input: size 字节大小
- * Output: void* 指针地址
- * Return:
- * Others: throw() 这个重载函数不会抛出任何异常
- * Modify Date Version Author Modification
- * ------------------------------------------------------------
- * 2022/03/09 1.0 Create
- **********************************************************************/
- void* Object::operator new[] (size_t size) throw()
- {
- return malloc(size);
- }
-
- /**********************************************************************
- * Function: Object::operator delete[]()
- * Description: 重载 delete[](数组)
- * Table Accessed:
- * Table Updated:
- * Input: void* 指针地址
- * Output:
- * Return:
- * Others:
- * Modify Date Version Author Modification
- * ------------------------------------------------------------
- * 2022/03/09 1.0 Create
- **********************************************************************/
- void Object::operator delete[] (void* p)
- {
- free(p);
- }
-
- /**********************************************************************
- * Function: Object::operator ==()
- * Description: ==重载函数
- * Table Accessed:
- * Table Updated:
- * Input:
- * Output:
- * Return:
- * Others:
- * Modify Date Version Author Modification
- * ------------------------------------------------------------
- * 2022/03/09 1.0 Create
- **********************************************************************/
- bool Object::operator == (const Object& obj)
- {
- return (this == &obj);
- }
-
- /**********************************************************************
- * Function: Object::operator !=()
- * Description: !=重载函数
- * Table Accessed:
- * Table Updated:
- * Input:
- * Output:
- * Return:
- * Others:
- * Modify Date Version Author Modification
- * ------------------------------------------------------------
- * 2022/03/09 1.0 Create
- **********************************************************************/
- bool Object::operator != (const Object& obj)
- {
- return (this != &obj);
- }
-
- /**********************************************************************
- * Function: Object::~Object()
- * Description: 析构函数
- * Table Accessed:
- * Table Updated:
- * Input:
- * Output:
- * Return:
- * Others:
- * Modify Date Version Author Modification
- * ------------------------------------------------------------
- * 2022/03/09 1.0 Create
- **********************************************************************/
- Object::~Object()
- {
-
- }
-
- }
Exception.cpp
Exception.h
与上一个相同