范型编程
㈠ C++中,什么是GP
分类: 电脑/网络 >> 程序设计 >> 其他编程语言
解析:
泛型编程也就是GP(Generic Programming),推崇与类型无关的编程思想。简单来说基蠢,就是将针对不同数据类型的相同算法从数据结构<类>中剥离出来,
这与传统的C++的继承和春锋敬多态截然不同。
可以说泛型思想中没有多少继承和多态的成分。甚至有背道而驰的味道。
在C++实现上,泛型严重依赖于模板机制,事实上如果没有模板的引入,泛型绝对不会在C++语言中获得如此巨大的成功!
泛型代码由C++编译器在编译期解释成二进制代码。也就是说,泛型的代码编译起来可能会使程序的二进制代码变大,但这一点也保证了程序在运行的时候不会损失效率...
当然泛型不是万能的,滥用泛型也许一样会使你的代码缓慢...
工具毕竟还是工具,思想和方法总有其局限性的。
如果扒慎没接触过,学习泛型编程,对你是一个全新的体验 。
㈡ C++所指的泛型编程是什么意思
就是具有通用性的,比如c++的atl和模板
㈢ c++模板与泛型的区别是什么呢
1、泛型编程就是以独立于任何特定类型的方式编写代码,而模板是泛型编程的基础。
2、模板定义以关键字template开始,后接尖括号括住的模板形参表。模板形参可以是表示类型的类型形参(type parameter),也可以是表示常量表达式的非类型形参(nontype parameter)。
㈣ 泛型在C++编程中有什么实际意义怎么用
泛型最大的意义就是代码重用和类型安全了
比如stl的vector,可以存放int,string或者用户自槐戚定义的任意类型的数据,代码只写一份就可以产生出无数类型的数组类型,而且是强类型的,没有template就只能用void,void来处理通用的问题,但是void是非类型安全。
楼主可以熟悉一下stl库,里面的尺明笑函数、陵含类基本都是模板手法实现的
㈤ C++中,什么是GP
泛型编程也就是GP(Generic Programming),推崇与类型无关的编程思想。简单来说,就是将针对不同数据类型的相同算法从数据结构<类>中剥离出来,
这与传统的C++的继承和多态截然不同。
可以说泛型思想中没有多少继承和多态的成分。甚至有背道而驰的味道。
在C++实现上,泛型严重依赖于模板机制,事实上如果没有模板的引入,泛型绝对不会在C++语言中获得如此巨大的成功!
泛型代码由C++编译器在编译期解释成二进制代码。也就是说,泛型的代码编译起来可能会使程序的二进制代码变大,但这一点也保证了程序在运行的时候不会损失效率...
当然泛型不是万能的,滥用泛型也许一样会使你的代码缓慢...
工具毕竟还是工具,思想和方法总有其局限性的。
如果没接触过,学习泛型编程,对你是一个全新的体验 。
㈥ 工作中 C++ 泛型编程用的多吗
在实际工作中,只是偶尔才会用到
但是懂得泛型很重要,因为很多重要的库都大量运用了泛型技术,对泛型有比较深入的了解,可滑岁以更好地使用这些库。比如有的库的类模板是有默认参数的,这实际上给了你自定义扩展的空间。
给你举个简单的例子,C++中的桥让弯map,也就是字典,完整的模板参数列表是这样的
template <class Key, class Value, class compare = less<Key>, class Allocator = allocator<pair<Key, Value>>()>
后面两个给出了默认模板实参,其中第三个是比较器,map默认使用的是定义敏闷在functional文件,继承自binray_function的less,其中调用了key自己的operator <。
第四个是内存配置器,如果你打算自己管理内存的话,可以自定义。
就说说第三个比较器吧,假如你需要一个键为std::string,但是比较的时候大小写不敏感的字典怎么办呢。string类型自己有了比较操作符了,于是你就可以自定义一个函数对象作为第三个模板参数。
㈦ 什么是泛型(C#概念)
在给你比较好懂的:
通过泛型可以定义类型安全类,而不会损害类型安全、性能或工作效率。您只须一次性地将服务器实现为一般服务器,同时可以用任何类型来声明和使用它。为此,需要使用 < 和 > 括号,以便将一般类型参数括起来。例如,可以按如下方式定义和使用一般堆栈:
public class Stack{ T[] m_Items; public void Push(T item) {...} public T Pop() {...}}Stack stack = new Stack();stack.Push(1);stack.Push(2);int number = stack.Pop();
代码块 2 显示一般堆栈的完整实现。将代码块 1 与代码块 2 进行比较,您会看到,好像 代码块 1 中每个使用 Object 的地方在代码块 2 中都被替换成了 T,除了使用一般类型参数蚂敬扒 T 定义 Stack 以外:
public class Stack{...}
在使用一般堆栈时,必须通知编译器使用哪个类型来代替一般类型参数 T(无论是在声明变量时,还是在实例化变量时):
Stack stack = new Stack();
编译器和运行库负责完成其余工作。所有接受或返回 T 的方法(或属性)都将改为使用指定的类型(在上述示例中为整型)。
代码块 2. 一般堆栈
public class Stack{ readonly int m_Size; int m_StackPointer = 0; T[] m_Items; public Stack():this(100) {} public Stack(int size) { m_Size = size; m_Items = new T[m_Size]; } public void Push(T item) { if(m_StackPointer >= m_Size) throw new StackOverflowException(); m_Items[m_StackPointer] = item; m_StackPointer++; } public T Pop() { m_StackPointer--; if(m_StackPointer >= 0) { return m_Items[m_StackPointer]; } else { m_StackPointer = 0; throw new InvalidOperationException("Cannot pop an empty stack"); } }}
注 T 是一般类型参数(或类型参数),而一般类型为 Stack。Stack 中的 int 为类型实参。
该编程模型的优点在于,内部算法和数据操作保持不变,而实际数据类型可以基于客户端使用服务器代码的方式进行更改。
泛型实现
表面上,C# 泛型的语法看起来与 C++ 模板类似,但是编译器实现和支持它们的方式存在重要差异。正如您将在后文中看到的那样,这对于泛型的使用方式具有重大意义。
注 在本文中,当提到 C++ 时,指的是传统 C++,而不是带有托管扩展的 Microsoft C++。
与 C++ 模板相比,C# 泛型可以提供增强的安全性,但是在功稿扒能方面也受到某种程度的限制。
在一些 C++ 编译器中,在您通过特定类型使用模板类之前,编译器甚至不会编译模板代码。当您确实指定了类型时,闷昌编译器会以内联方式插入代码,并且将每个出现一般类型参数的地方替换为指定的类型。此外,每当您使用特定类型时,编译器都会插入特定于该类型的代码,而不管您是否已经在应用程序中的其他某个位置为模板类指定了该类型。C++ 链接器负责解决该问题,并且并不总是有效。这可能会导致代码膨胀,从而增加加载时间和内存足迹。
在 .NET 2.0 中,泛型在 IL(中间语言)和 CLR 本身中具有本机支持。在编译一般 C# 服务器端代码时,编译器会将其编译为 IL,就像其他任何类型一样。但是,IL 只包含实际特定类型的参数或占位符。此外,一般服务器的元数据包含一般信息。
客户端编译器使用该一般元数据来支持类型安全。当客户端提供特定类型而不是一般类型参数时,客户端的编译器将用指定的类型实参来替换服务器元数据中的一般类型参数。这会向客户端的编译器提供类型特定的服务器定义,就好像从未涉及到泛型一样。这样,客户端编译器就可以确保方法参数的正确性,实施类型安全检查,甚至执行类型特定的 IntelliSense。
有趣的问题是,.NET 如何将服务器的一般 IL 编译为机器码。原来,所产生的实际机器码取决于指定的类型是值类型还是引用类型。如果客户端指定值类型,则 JIT 编译器将 IL 中的一般类型参数替换为特定的值类型,并且将其编译为本机代码。但是,JIT 编译器会跟踪它已经生成的类型特定的服务器代码。如果请求 JIT 编译器用它已经编译为机器码的值类型编译一般服务器,则它只是返回对该服务器代码的引用。因为 JIT 编译器在以后的所有场合中都将使用相同的值类型特定的服务器代码,所以不存在代码膨胀问题。
如果客户端指定引用类型,则 JIT 编译器将服务器 IL 中的一般参数替换为 Object,并将其编译为本机代码。在以后的任何针对引用类型而不是一般类型参数的请求中,都将使用该代码。请注意,采用这种方式,JIT 编译器只会重新使用实际代码。实例仍然按照它们离开托管堆的大小分配空间,并且没有强制类型转换。
泛型的好处
.NET 中的泛型使您可以重用代码以及在实现它时付出的努力。类型和内部数据可以在不导致代码膨胀的情况下更改,而不管您使用的是值类型还是引用类型。您可以一次性地开发、测试和部署代码,通过任何类型(包括将来的类型)来重用它,并且全部具有编译器支持和类型安全。因为一般代码不会强行对值类型进行装箱和取消装箱,或者对引用类型进行向下强制类型转换,所以性能得到显着提高。对于值类型,性能通常会提高 200%;对于引用类型,在访问该类型时,可以预期性能最多提高 100%(当然,整个应用程序的性能可能会提高,也可能不会提高)。本文随附的源代码包含一个微型基准应用程序,它在紧密循环中执行堆栈。该应用程序使您可以在基于 Object 的堆栈和一般堆栈上试验值类型和引用类型,以及更改循环迭代的次数以查看泛型对性能产生的影响。
㈧ C++中用到泛型编程后,出现这些错误是什么意思
你用的什么编译器? 这个警告的意思是实现的这个类的名字太长了。 新的编译器应该很少见这个问题
关于警告, 如果你想认真编程,应该开4级警告,并且确保解决所有warning(这个warning没办法,只能用#pragma告诉他别报了)。 写程序留着warning只能应付老师而已,在工作里是不行的
㈨ 泛型编程中怎么实现运算符重载
返回类型 operator 运算符 (左边的参数, 右边的参数 )
比如说重载string类型败卜旅的弊野 +的话, 就是
string operator + (string, string) ; 实际上因为效率的关系, 参数类型一般写成const string&.
第二 作为成员函数. 格式是
返回类型 operator 运算符 (右边的参数 )
注意, 运算符左边的参数没有了, 以为察凳class 的this就是左参数.
class string
{
string operator +(string); // 重载了 string + string 的操作
string operator +(int); // 重载了 string + int 的操作.
};
此外就是, 重载操作符的参数必须至少有一个 "不是内置类型.".
因此, 规定了不允许重载内置类型间的操作, 比如说重载 int+ int 是不许可的.