- 浏览: 543462 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (231)
- 一个操作系统的实现 (20)
- 汇编(NASM) (12)
- Linux编程 (11)
- 项目管理 (4)
- 计算机网络 (8)
- 设计模式(抽象&封装) (17)
- 数据结构和算法 (32)
- java基础 (6)
- UML细节 (2)
- C/C++ (31)
- Windows (2)
- 乱七八糟 (13)
- MyLaB (6)
- 系统程序员-成长计划 (8)
- POJ部分题目 (10)
- 数学 (6)
- 分布式 & 云计算 (2)
- python (13)
- 面试 (1)
- 链接、装载与库 (11)
- java并行编程 (3)
- 数据库 (0)
- 体系结构 (3)
- C++ template / STL (4)
- Linux环境和脚本 (6)
最新评论
-
chuanwang66:
默默水塘 写道typedef void(*Fun)(void) ...
C++虚函数表(转) -
默默水塘:
typedef void(*Fun)(void);
C++虚函数表(转) -
lishaoqingmn:
写的很好,例子简单明了,将观察者模式都表达了出来。
这里是ja ...
观察者模式——Observer
参考书 <C++ By Dissection>
In C++, there are 3 different ways to employ generic coding techniques:
void* pointers,
Templates,
Inheritance.
一、为什么使用模板进行泛型编程更好
举例:通用数组拷贝
方法一、二:使用void* 和 template
可以用void*或template来实现“通用数组拷贝 ”,但是后者 有以下优势——
(1)按元素拷贝,不依赖平台,增强可移植性 。
void*因为不知道每个元素的大小elementSize,只能将elementSize作为参数传入,但C++中类型的长度依赖平台,因此移植性不好。
(2)若源和目的数组类型不同,提供类型保护 (编译时报错unification error)。
void*不能满足这个要求。
#include <iostream> using namespace std; //ordinary int transfer1(int from[], int to[], int size){ for(int i=0;i<size;i++){ to[i]=from[i]; } return size; } //void* generic assignment function int transfer2(void* from, void* to, int elementSize, int size){ int nBytes=elementSize*size; for(int i=0;i<nBytes;i++){ static_cast<char*>(to)[i]=static_cast<char*>(from)[i]; } return size; } //template generic assignment function template<class T> int transfer3(T* from, T* to, int size){ for(int i=0;i<size;i++){ to[i]=from[i]; } return size; } template<class T> void printArr(T from[], int size){ for(int i=0;i<size;i++) cout<<from[i]<<"\t"; cout<<endl; } int main(void){ int a[10]={1,2,3,4,5,6,7,8,9,10},b[10]; double c[20]={10,9,8,7,6,5,4,3,2,1},d[20]; transfer1(a,b,10); printArr(b,10); //使用void* 只能逐字节拷贝 transfer2(c,d,8,10); printArr(d,10); //使用模板,可以仍然逐元素拷贝 d[1]++; transfer3(d,c,10); printArr(c,10); //相比void*,template仍然提供类型保护(type-safety) transfer3(a,c,10); //报错 transfer2(a,c,4,10); //不报错 system("pause"); return 0; }
方法三:使用宏定义
我来评价一下宏定义实现泛型编程的优势和劣势——
(1)宏定义优势:
简单性(Simplicity)、习惯性(familiarity)、高效性(Efficiency)。
其中,习惯性是由于在C编程中使用宏(macros)的传统;高效性主要因为没有函数调用的开销。
(2)宏定义劣势:
没有类型保护(type-safety)、预期外的计算(unanticipated evaluations)、范围问题(Scoping problem)
其中,与使用模板对比,解释一下“预期外的计算”。例如,计算立方,
可以使用宏
#define CUBE(X) ((X)*(X)*(X))
可以使用模板
template<class T> T cube(T x) {return x*x*x;}
现在需要计算(sqrt(7))³
如果使用宏,CUBE(sqrt(7)),因为是直接文本替换,计算了三次sqrt(7);
如果使用函数,cube(sqrt(7)),则只调用一次sqrt(7)。
这样一来,虽然宏没有函数调用的开销(使用对战的机制),但是重复的计算使得它的优势得不偿失:(
#include <iostream> using namespace std; #define COPY(A,B,N)\ {int i; \ for(i=0;i<(N);++i) (B)[i]=(A)[i];} template<class T> void printArr(T from[], int size){ for(int i=0;i<size;i++) cout<<from[i]<<"\t"; cout<<endl; } int main(void){ int a[10]={1,2,3,4,5,6,7,8,9,10},b[10]; double c[20]={10,9,8,7,6,5,4,3,2,1},d[20]; COPY(a,b,10); printArr(b,10); system("pause"); return 0; }
二、使用模板
1. Template Class 模板类
2. Function Templates 函数模板
Many functions have the same code body, regardless of type(例如上面的例子)
发表评论
-
C++引用计数
2013-12-29 14:48 1166主要参考《提高C++性能的编程技术》第12章 引用计数 ... -
string.h(二)C的字符串分隔函数strtok()
2013-12-19 13:25 1508char *strtok(char *str1, c ... -
关于size_t 和 ptrdiff_t 【转】
2013-12-12 18:57 859Abstract Introduction size ... -
new, operator new 和 placement new
2013-12-12 17:08 1077一、new 和 delete 的过程: 在进行一切讲解之 ... -
C/C++柔性数组 char[0]
2013-11-08 15:57 1009在标准C和C++中0长数组 ... -
填充与对齐——指定变量的地址偏移【转】
2013-11-08 14:53 858转自 http://hi.baidu.com/bai_ye ... -
数组和指针并不同(总结《C专家编程chap4》)
2013-10-06 14:55 941左值(地址)和右值(地址的内容): 1. 使用数组 ... -
细说C++全局变量、局部变量和静态局部变量【转】
2013-08-15 17:17 863转自http://see.xidian.ed ... -
strcpy和strncpy用法和区别(转)
2013-07-31 17:37 31strcpy和strncpy用法和区别 转自:http ... -
stl iterator&const_iterator
2013-07-11 09:38 14iterator和const_iterator访问conta ... -
C++类对象创建过程揭密(转载)
2013-05-24 16:56 927转载:http://blog.csdn.net ... -
C调用汇编
2013-03-27 20:28 1460一、汇编语言的两种语法格式 Intel格式: 大 ... -
C++四个类型转换关键字const_cast, static_cast, dynamic_cast, reinterpret_cast
2013-02-27 10:13 2536C风格的强制类型转换( ... -
C/C++中内存模型
2012-12-30 11:07 1634一直以来,C++ ... -
map使用
2012-12-29 15:21 35需要#include <map> 定义map& ... -
C++调用C
2012-11-29 22:42 1279一般地,C++调用C有两种形式(网上资料一般没讲全): ... -
关于计算精度
2012-11-22 14:53 876本文是Sam我总结的,在C++学习过程中常见的一些涉及 ... -
C++随机数
2012-11-07 19:41 914C++随机数 #include<iostream ... -
C文件操作(一)
2012-11-07 19:11 1612C文件操作(流式文件 &a ... -
C++中的内联函数inline
2012-07-13 19:16 1073在c++中,为了解决一些频繁调用的小函数大量消耗栈空间或者 ...
相关推荐
在C++语言中,模板是一种泛型编程机制,用于实现函数和类的泛型化。模板可以是函数模板,也可以是类模板。函数模板用于实现函数的泛型化,而类模板用于实现类的泛型化。 输入输出流 在C++语言中,输入输出流是用于...
首先,模板是C++中实现泛型编程的核心机制。它允许程序员编写能够处理不同类型数据的通用代码,无论是函数还是类。模板主要有两种形式:函数模板和类模板。 函数模板是一种通用函数,它不直接定义函数的行为,而是...
7. 函数模板和泛型编程。 8. C++11及更高版本的新特性,如lambda表达式,右值引用。 **gdb** gdb是GNU调试器,用于调试C和C++程序: 1. 启动gdb:运行已编译的程序,设置断点。 2. 控制执行:run(开始执行),...
C++是一种强大的、通用的编程语言,它在C语言的基础上扩展了面向对象和泛型编程的概念,使得程序设计更加灵活高效。C++的发展历程可以追溯到二十世纪七十年代,由Bjarne Stroustrup在C语言的基础上进行改进,旨在...
C++模板是一种泛型编程工具,允许创建函数和类的通用版本,可以处理不同类型的数据。函数模板允许定义一个可以接受任意类型参数的函数,而类模板则可以生成通用的类。模板的目的是提高代码的复用性和灵活性,减少...
- **解答:** 模板是C++中一种重要的泛型编程工具。它允许程序员编写通用的代码,可以在多种不同的数据类型上工作,而无需为每种类型显式地重写代码。模板的主要优势在于提高了代码的复用性和灵活性,减少了代码冗余,...
13. 在函数模板的参数中,用`class`修饰的参数称为**类型**参数,用于泛型编程。 14. 假定类型参数用`T`表示,给定的两个函数`int cubin(int n)`和`double cubin(double n)`是函数模板的两个实例,那么该函数模板的...
12. **模板**:模板是泛型编程的基础,可以用于类和函数。类模板实例化时,编译器会根据给定的模板参数生成一个类,选项B正确。 13. **标识符**:在C++中,标识符可以包含字母、数字和下划线,但不能以数字开头。...
此外,C++还支持泛型编程,通过模板机制来实现。 - **C++的历史背景**:C++是由Bjarne Stroustrup在20世纪80年代初开发的。他最初将C++称为“C with Classes”,旨在保留C语言的所有功能并添加面向对象的特性。随着...
9. 当执行`cin`语句时,从键盘上输入每个数据后必须接着输入一个换行符('\n')才能继续输入下一个数据。 10. 重载一个函数的条件是:该函数必须在参数的个数或参数的类型上与其它同名函数有所不同。 11. 如果一个...
在这个问题中,人们按顺时针方向从1开始报数,每数到m的人就会出局,然后从下一个人继续开始报数。程序的目标是找到最后一个留在圈中的人的编号。 3. **C++编程** 实现约瑟夫问题的代码使用了C++语言,包括结构体...
9. **模板**:模板是C++中的泛型编程工具,可以用于创建类(类模板)或函数(函数模板)。`template<class T>`中的`T`是类型参数,代表任意数据类型。 10. **运算符重载的实现**:当运算符重载为类的成员函数时,`...
- C++模板允许创建泛型代码,适用于多种类型,提高了代码的重用性和灵活性,同时在编译时确保类型安全,并有助于跨平台的代码移植。 以上内容反映了华为面试笔试题中涵盖的关键C++概念,这些知识对于任何想要在IT...
- 兼备高级语言的结构和编程环境,同时拥有类似低级语言(如汇编语言)的系统资源操纵能力。 - 目标代码的执行效率仅略低于汇编语言,比大多数其他高级语言高。 - 丰富的运算符、数据类型和表达式,适用于各种...
- 模板类允许创建泛型代码,适应多种数据类型,增强了代码的重用性和灵活性。 - 支持泛型算法,如容器和迭代器,使得算法独立于具体的数据类型。 - 提供了类型无关的容器和函数,例如C++标准库中的`std::vector`...
5. **泛型与模板集成**:C++/CLI提供了与.NET泛型的交互,虽然.NET泛型仅适用于托管类型,而C++模板可以应用于托管和非托管类型,两者结合提供了更大的灵活性。 6. **大型框架集成**:C++/CLI能够利用.NET ...
- **模板与泛型编程**:C++支持模板机制,允许编写泛型代码,使得程序员可以编写可复用且高效的代码。 - **类与对象**:C++提供了面向对象编程的支持,允许定义类和创建对象,支持封装、继承和多态等特性。 - **...
从面向过程到面向对象,再到泛型和元编程,C++的每一步都体现了程序员对效率、灵活性和抽象层次的追求。随着C++20及以后版本的发布,C++将继续在软件开发领域扮演关键角色,提供强大而灵活的工具,服务于各种复杂的...