c语言中模板
A. c语言中的一个模板中“ ^!”代表什么意思
! “非”运算。 非真为假,非假为真。
----------
^ “异或”运算, 按位运算符
参与运算的两个值,如果两个相应位相同,则结果为0,否则为1。即:0^0=0, 1^0=1, 0^1=1, 1^1=0
------
A ^! B -- 先计算 (非B) ,再计算 A 异或 (非B)
B. 在C语言中类成员,函数重载,继承,派生类,类模板怎么定义。
C语言中没有类的概念,C++中才有类,有类成员变量,成员函数,对象,以及重载,继承,派生的概念;
函数的重载是指在同一个类中具有相同的函数名,但是可能函数的返回值类型,或者形参个数,或者形参类型不同;
派生是指基类跟子类的关系:例如class
A:public
B;类A共有继承B;
呵呵,这些东西需要你慢慢看,注意重载
跟覆盖的区别以及与虚函数之间的关系,等等
至于类模板,就是你定义一个类,而不指定数据类型,关键字template,等到后面的开发中你可以实际根据需要实例化为你想要的
类型,例如int
,char,struct
等等
C. 什么是C++模板
、模板是一种工具。使用它会给程序员编写大规模的软件带来方便。因为使用模板可以使程序员建立具有通用类型的函数库和类库。模板也是C++语言支持参数化多态性的工具。将一段程序所处理的对象类型参数化,就可以使这段程序能够处理某个类型范围内的各种类型的对象,这就是参数化多态性。被参数化的一段程序将会处理一定范围内的若干种不同类型的对象,即对于一定范围内的若干不同类型的对象的某种操作将对应着一个相同结构的实现。而模板这种工具就是用来解决这个问题的。由于C++语言的程序结构主要是由函数和类构成的,因此,模板也具有两种不同的形式:函数模板和类模板。
4、函数模板与模板函数
函数模板是对一组函数的描述,它不是一个实实在在的函数,编译系统并不产生任何执行代码。
当编译系统在程序中发现有与函数模板中相匹配的函数调用时,便生成一个重载函数,该重载函的函数体与函数模板的函数体相同。该重载函数称为模板函数。
函数模板与模板函数的区别如下:
(1) 函数模板不是一个函数,而是一组函数的模板,在定义中使用了参数类型。
(2) 模板函数是一种实实在在的函数定义,它的函数体与某个模板函数的函数体相同。
编译系统遇到模板函数调用时,将生成可执行代码。函数模板是定义重载函数的一种工具。一个函数模板只为一种原型函数生成一个模板函数,不同原型的模板函数是重载的。这样就使得一个函数只需编码一次就能用于某个范围的不同类型的对象上。因此,可以说函数模板是提供一组重载函数的样板。
D. c语言中一个模板中“^!”是什么意思
是你所想象的那么复杂:
你所定义的min函数模板和xutility的min函数模板的名字是一样的,编译器认为你是在重载xutility中的min函数,而你那样重载明显是不行的!所以的话你只要改一下函数的名字即可。
#include <iostream>,这一行将iostream包含进来了,估计这个文件或者是它所包含的文件中一某一个头文件将xutility文件include进来了。。。
然后你又using namespace std;使用std命名空间,而xutility中的min函数模板正是定义在std名字空间之下,所以xutility中的min函数模板起作用了。
你将using namespace std;去掉也可以解决问题, 但cout换成std::cout,endl换成std::endl即可。
至于VC6对STL的支持有限,固并没有所错。
希望我的问答对你有所帮助!
E. c语言菜单模板
#include
#include
void function1(){
}
void function2(){
}
void function3(){
}
int main(int argc, char *argv[]){//主函数
char choice; //暂存选择
while(true){
printf("-----------------主题-----------21/11/14 18:38\n\n");
printf("1:功能1\n2:功能2\n3:功能3\n4:退出\n请选择操作:");
scanf("%c",&choice);
switch(choice){
case '1' : function1();break;
case '2' : function2();break;
case '3' : function3();break;
case '4' : return 0;break;
}
system("cls");
}
}
F. 编写c语言程序时构成程序的基本模板叫什么
编写c语言程序时构成程序的基本模板叫:函数
G. c++模板概念是什么详细点
有以下这样3个求加法的函数:
int Add(int x,int y)
{
return x+y;
}
double Add(double x,double y)
{
return x+y;
}
long Add(long x,long y)
{
return x+y;
}
它们拥有同一个函数名,相同的函数体,却因为参数类型和返回值类型不一样,所以是3个完全不同的函数。即使它们是二元加法的重载函数,但是不得不为每一函数编写一组函数体完全相同的代码。如果从这些函数中提炼出一个通用函数,而它又适用于多种不同类型的数据,这样会使代码的重用率大大提高。那么 C++的模板就可解决这样的问题。模板可以实现类型的参数化(把类型定义为参数),从而实现了真正的代码可重用性。C++中的模板可分为函数模板和类模板,而把函数模板的具体化称为模板函数,把类模板的具体化成为模板类。
H. c语言编程时的模板里面{跟//是什么意思
{和}是匹配的
表示一个单独的
程序段
。
当if
while
for等
这类
控制语句
,要包含多余一句的语句时
需要用{}括起来。
//表示注释
。
//之后到行末
只给编写程序的人看,
编译器
不会处理。
I. C语言elemtype
我理解你说的意思是不是想让elemtype可以替换任意一种类型?
如果是的话,这种东西叫做模板,它是C++的内容,不在C语言的范畴内。
具体用法是:
template <typename elemtype>
typedef struct{
elemtype *elem;
int length;
int listsize;
}sqlist;
之后声明变量时要赋予elemtype一个已知的类型,比如int。
struct sqlist<int> a;
对于a这里面的elemtype就变成了int。
不过这是C++的内容,C里面不能用。
如果不用模板,而必须在C语言里用的话,有两种方法。
1. 之前声明它
typedef int elemtype;
2. 之前预编译它
#define elemtype int
J. 在c语言中如何实现函数模板
各种用
C
语言实现的模板可能在使用形式上有所不同。现以一个求和函数
Sum
为例,用
C++
Template
可写如下:
template
R
Sum(const
T
*array,
int
n)
{
R
sum
=
0;
for
(int
i
=
0
;
i
<
n
;
++i)
sum
+=
i;
return
sum;
}
如果不是内置类型,该模板隐式地需要
有R
R::operator+=(T)运算符可用。
1.
使用函数指针作为
Functor
替换者
Typedef
struct
tagAddClass
{
Void
(*add)(char*
r1,
const
char*
r2);
Int
elemSize;
Char
sum[MAX_ELEM_SIZE];
}
AddClass;
void
Sum(AddClass*
self,
const
char*
array,
int
n)
{
for
(int
i
=
0
;
i
<
n
;
++i)
self->add(self->sum,
array
+
i*self->elemSize);
}
使用时:
Void
AddInt(char*
r1,
const
char*
r2)
{
*(long*)r1
+=
*(int*)r2;
}
AddClass
addClass
=
{AddInt,
2,
0
};
Int
array[100];
Read(array);
Sum(&addClass,
array,
100);
…..
2.
用宏作为Functor的替换者
#define
GenSumFun(SumFunName,
Add,
RetType,
ElemType)
RetType
SumFunName
(const
ElemType
*array,
int
n)
\
{
RetType
sum
=
0;
for
(int
i
=
0
;
i
<
n
;
++i)
Add(sum,
i);
return
sum;
}
使用时:
#define
AddInt(x,
y)
((x)
+=
(y))
GenSumFun(SumInt,
AddInt,
long,
int)
…..
Int
array[100];
Read(array);
Long
sum
=
SumInt(array,
100);
…..
3.
所有可替换参数均为宏
至少需要一个额外的文件(实现文件)为
impsum.c
/*
impsum.c
*/
RetType
FunName(const
ElemType
*array,
int
n)
{
RetType
sum
=
0;
for
(int
i
=
0
;
i
<
n
;
++i)
Add(sum,
i);
return
sum;
}
使用时:
#undef
RetType
#undef
FunName
#undef
ElemType
#undef
Add
#define
AddInt(x,
y)
((x)
+=
(y))
#define
RetType
long
#define
FunName
SumInt
#define
ElemType
int
#define
Add
AddInt
#include
impsum.c
…..
Int
array[100];
Read(array);
Long
sum
=
SumInt(array,
100);
4.
总结:
第一种方法,易于跟踪调试,但是效率低下,适用于对可变函数(函数指针)的效率要求不高,但程序出错的可能性较大(复杂),模板函数(Sum)本身很复杂,模板参数也比较复杂(add)的场合。
第二种方法,效率高,但很难跟踪调试,在模板函数和模板参数本身都很复杂的时候更是如此。
第三种方法,是我最近几天才想出的,我认为是最好的,在模板参数(Add)比较复杂时可以用函数(第二种也可以如此),简单时可以用宏,并且,易于调试。在模板函数本身很复杂,而模板参数比较简单时更为优越。但是,可能有点繁琐。
