因为c++有名命修饰,他会把每一个参数的类型啥的用一个字符串来表示加到函数名上。所以重载的两个同名函数编译出来的函数名不同,所以不冲突
创新互联服务项目包括中卫网站建设、中卫网站制作、中卫网页制作以及中卫网络营销策划等。多年来,我们专注于互联网行业,利用自身积累的技术优势、行业经验、深度合作伙伴关系等,向广大中小型企业、政府机构等提供互联网行业的解决方案,中卫网站推广取得了明显的社会效益与经济效益。目前,我们服务的客户以成都为中心已经辐射到中卫省份的部分城市,未来相信会继续扩大服务区域并继续获得客户的支持与信任!
c没有命名修饰,函数叫啥编译出来就叫啥,同名函数当然会冲突的
从字面上的意思就是,可以重复进入。可重入是在多任务系统下的概念,意思是这个函数可以在运行到任意位置的时候被中断去执行其他任务,并且返回的时候不会出现任何错误。为什么在多任务的时候才有这种概念。我举个例子,我们定义了一个叫func的函数,同时定义了两个线程,两个线程都调用了func,那么就存在这种情况,线程1正在执行func的时候,线程2开始执行func了,导致两个时刻两个线程都在执行func,正常情况下两个都能执行成功,并且没有错误,我们就认为func是可重入的。但是如果func使用了公共资源,比如读取同一个文件,或者访问了同一个全局变量,这时候就会导致两个线程访问公共资源时发生冲突,这样的函数就是不可重入的。
c语言没有重载的概念,重载是C++的内容
c++运算符:
算术运算符:+,-,*,/,%,++,--;
位操作运算符:,|,~,^(位异或),<<(左移),>>(右移)
逻辑运算符:!,,||;
比较运算符:<,>,>=,<=,==,!=;
赋值运算符:=,+=,-=,*=,/=,%=,=,|=,^=,<<=,>>=;
其他运算符:[],(),->,,(逗号运算符),new,delete,new[],delete[],->*。
不能重载的总共五个:
(1)
"."(类成员访问运算符)
(2)"
.*"(类成员指针访问运算符)
(3)
"::"(域运算符)
(4)"siezof"(长度运算符)
(5)
"
?:"(条件运算符)
还有就是:typeid.
其中
.*是C++的类成员函数指针调用运算符,是用来调用一个类函数指针的。
举例:
假设有一个ClassA类拥有一个成员函数void
ClassA::func(int
i),则可以这么用:
1
2
3
4
void
(ClassA::*fp)(int
i)
//
定义一个类函数指针。
ClassA
obj;
fp
=
ClassA::func;
//
给这个类函数指针赋值
(obj.*fp)(5);
//
这么用,相当于调用obj.func(5);
没有什么非禁止operator?:重载的理由,只不过没有必要而已。另外,expr1?expr2:expr3的重载函数无法保证expr2和expr3中只有一个被执行。
而“sizeof”无法被重载是因为不少内部操作,比如指针加法,都依赖于它,例如:
X
a[10];
X*
p
=
a[3];
X*
q
=
a[3];
p++;
//
p
points
to
a[4]
//
thus
the
integer
value
of
p
must
be
//
sizeof(X)
larger
than
the
integer
value
of
q
这样,sizeof(X)无法在不违背基本语言规则的前提下表达什么新的语义。
在N::m中,N和m都不是表达式,它们只是编译器“认识”的名字,“::”执行的实际操作是编译时的名字域解析,并没有表达式的运算牵涉在内。或许有人会觉得重载一个“x::y”(其中x是实际对象,而非名字域或类名)是一个好主意,但这样做引入了新的语法[译注:重载的本意是让操作符可以有新的语义,而不是更改语法——否则会引起混乱],我可不认为新语法带来的复杂性会给我们什么好处。
原则上来说,“.”运算符是可以被重载的,就像“-”一样。不过,这会带来语义的混淆——我们到底是想和“.”后面的对象打交道呢,还是“.”后面的东东所实际指向的实体打交道呢?看看这个例子(它假设“.”重载是可以的):
class
Y
{
public:
void
f();
//
...
};
class
X
{
//
assume
that
you
can
overload
.
public:
Y*
p;
Y
operator.()
{
return
*p;
}
void
f();
//
...
};
void
g(X
x)
{
x.f();
//
X::f
or
Y::f
or
error?
}
请注意:
1.
重载不能改变该运算符用于内置类型时的函义,程序员不能改变运算符+用于两个int型时的含义。
2.
运算符函数的参数至少有一个必须是类的对象或者类的对象的引用。这种规定可以防止程序员运用运算符改变内置类型的函义。
3.
重载不能改变运算符的优先级。
4.
重载不能改变运算符的结合律。
5.
重载不能改变运算符操作数的个数。比如+需要两个操作数,则重载的+也必须要有两个操作数。
这个问题问的不错。
其实printf不是重载,c语言不支持函数重载 这句话是对的。
printf函数是通过变长参数表实现的。你可以查看一下printf的函数原型声明。
printf函数的实现在不同的机器上是不同的,但提供的接口是一致的。
printf函数的正确声明形式如下:
int printf(const *fmt,...)
其中省略号表示参数表中参数的数量和类型是可变的。它是变长参数表的固定形式。
省略号只能出现在参数表的尾部。
具体的话你还是上网查查吧,我对这个原型也没研究。
我想既然你能问这个问题,看点资料不难理解,很快能明白怎么回事。明白了以后,你就可以自己写出这样变长参数表的函数了。好好加油!
#include iostream
using namespace std;
class fun_overload{//定义一个重载函数类
public:
void display(int int_num ){//输出整型方法
cout"int: "int_numendl;
}
void display(char cha_num ){//输出字符方法
cout"char: "cha_numendl;
}
void display( double dou_num ){//输出双精度型方法
cout"double: "dou_numendl;
}
void display( float flo_num){//输出浮点型方法
cout"float: "flo_numendl;
}
void display(short sho_num ){//输出短整型方法
cout"short: "sho_numendl;
}
fun_overload(){};//构造
~fun_overload(){};//析构
};
int main()
{
fun_overload *f=0;
int a=1;
char b='a';
double c=1.1;
float d=1.110f;
short e=1;
//指针调用fun_overlaod类里的不同类型的函数
f-display(a );
f-display(b );
f-display(c );
f-display(d );
f-display(e );
getchar();
system("cls");
return 0;
}
int x,y,n=0; // 这个语句只会初始化n为0,不会初始化x,y为0。
没被初始化的变量x、y,其值随机。所以程序执行会有问题。
---
至于函数重载,C语言不支持,C++才支持。
查看codeblocks所用math.h,只有一个名为fabs的函数,即
_CRTIMP double __cdecl fabs (double);
还有一个名为fabsf的函数:
extern float __cdecl fabsf (float x);
因为#include cmath指令包含的是文件math.h,而math.h继承至C语言,C语言不支持函数重载,所以fabs不会是重载函数。