
正文
c++语言重载,c++ 重载
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
C语言,fabs有多个重载函数,请问是哪里错了,急在线等
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不会是重载函数。
相关问答
Q1: 在C语言中类成员,函数重载,继承,派生类,类模板怎么定义。
C语言中没有类的概念,C++中才有类,有类成员变量,成员函数,对象,以及重载,继承,派生的概念;
函数的重载是指在同一个类中具有相同的函数名,但是可能函数的返回值类型,或者形参个数,或者形参类型不同;
派生是指基类跟子类的关系:例如class
A:public
B;类A共有继承B;
呵呵,这些东西需要你慢慢看,注意重载
跟覆盖的区别以及与虚函数之间的关系,等等
至于类模板,就是你定义一个类,而不指定数据类型,关键字template,等到后面的开发中你可以实际根据需要实例化为你想要的
类型,例如int
,char,struct
等等
Q2: C语言实现一个数组类运算符重载的问题
//arry.h
class arry {
int *pt; //数组指针
int length; //数组长度
public:
arry operator+(const arry);
//+运算符重载 实现两个数组的连接:int A[]={1,2,3};
//
......//int B[]={4,5,6};A+b={1,2,3,4,5,6}
}
//arry.c
.......
arry arry::operator+(const arry a) {
int *temp = new int[length + a.length];
for(int i = 0;i length;i++) temp[i] = pt[i];
for(i = 0;i a.length;i++) temp[i + length] = a.pt[i];
delete []pt; // 释放原空间
pt = temp; // 重置指针
length += pt,length; // 修改数据成员
return *this; // 返回自身
}
Q3: C语言支持函数重载吗
C语言是不支持函数重载的,但是C++是可以的,这是C++对C的一个重要扩展。
Q4: c语言,c++,哪些运算符不能重载?
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. 重载不能改变运算符操作数的个数。比如+需要两个操作数,则重载的+也必须要有两个操作数。
关于c++语言重载和c++ 重载的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。








