C++ 模板类=设计 or template class operator=
2016-06-26 14:43
459 查看
设计一个模板类,某个成员变量是在调用的时候才能知道其具体类型。设计重载运算符=。
需要特别重视的是:
其中一次输出结果:
需要特别重视的是:
Vec<int>与
Vec<float>是不同的类型,不同类型之间的赋值,会默认调用类型转换函数。
模板类
// undefied behavior for 0 > _len template<class _T> class Vec{ public: Vec() : _len(0), _dat(NULL) {} Vec(const int32_t len) { _len = len; _dat = new _T[len]; } Vec(const int32_t len, const _T &val) { _len = len; _dat = new _T[len]; for (int32_t i = 0; i < _len; i++){ _dat[i] = val; } } template<class CT> Vec(const Vec<CT> &obj){ _len = obj.get_len(); if (0!=_len){ _dat = new _T[_len]; } for (int32_t i = 0; i < _len; i++){ _dat[i] = (_T)(obj.get_dat()[i]); } } ~Vec(){ if (_dat){ delete[] _dat; _dat = NULL; } _len = 0; } public: Vec<_T>& operator=(const Vec<_T> &B){ if (_dat){ delete[] _dat; } _len = B._len; if (0!=_len){ _dat = new _T[B._len]; } for (int i = 0; i < _len; i++){ _dat[i] = B._dat[i]; } return *this; } public: // utilities template<class T> friend std::ostream& operator<<(std::ostream &output, Vec<T> &am); int32_t get_len() const{ return _len; } _T* get_dat() const { return _dat; } private: int32_t _len; _T* _dat; }; template<class T> std::ostream& operator<<(std::ostream &output, Vec<T> &am){ output << am._dat << " : "; for (int32_t i = 0; i < am._len; i++){ cout << am._dat[i] << " "; } return output; }
测试
Vec<int16_t> A(10, 2); Vec<int32_t> B; B = A; cout << A << endl; cout << B << endl;
其中一次输出结果:
01409C88 : 2 2 2 2 2 2 2 2 2 2 0140BA18 : 2 2 2 2 2 2 2 2 2 2
B=A首先 调用
Vec<int32_t>(A)构造一个临时的
Vec<int32_t>的对象, 对应被调用的构造函数是
Vec<int16_t>(const Vec<int16_t>&). 然后,以被构造的临时对象为右参数调用
Vec<int32_t>& operator=(const Vec<int32_t>&). 最后,将临时构造的对象给析构。
补充
经测试,以下代码也是可以的// undefied behavior for 0 > _len template<class _T> class Vec{ public: Vec() : _len(0), _dat(NULL) {} Vec(const int32_t len) { _len = len; _dat = new _T[len]; } Vec(const int32_t len, const _T &val) { _len = len; _dat = new _T[len]; for (int32_t i = 0; i < _len; i++){ _dat[i] = val; } } ~Vec(){ if (_dat){ delete[] _dat; _dat = NULL; } _len = 0; } public: template<class T2> Vec<_T>& operator=(const Vec<T2> &B){ if (_dat){ delete[] _dat; } _len = B.get_len(); if (0!=_len){ _dat = new _T[B.get_len()]; } for (int i = 0; i < _len; i++){ _dat[i] = B.get_dat()[i]; } return *this; } public: // utilities template<class T> friend std::ostream& operator<<(std::ostream &output, Vec<T> &am); int32_t get_len() const{ return _len; } _T* get_dat() const { return _dat; } private: int32_t _len; _T* _dat; };
相关文章推荐
- Android Native 绘图方法
- 如何组织构建多文件 C 语言程序(二)
- 如何写好 C main 函数
- C#中struct和class的区别详解
- Lua和C语言的交互详解
- VBS ArrayList Class vbs中的数组类
- 大家看了就明白了css样式中类class与标识id选择符的区别小结
- 关于C语言中参数的传值问题
- 简要对比C语言中三个用于退出进程的函数
- 深入C++中API的问题详解
- 基于C语言string函数的详解
- C语言中fchdir()函数和rewinddir()函数的使用详解
- C语言内存对齐实例详解
- C语言编程中统计输入的行数以及单词个数的方法
- C语言自动生成enum值和名字映射代码
- C语言练习题:自由落体的小球简单实例
- 使用C语言判断英文字符大小写的方法
- c语言实现的带通配符匹配算法
- C语言实现顺序表基本操作汇总
- C语言中进制知识汇总