在C++中为什么不能把两个运算符重载都作为成员函数

作者&投稿:剑悦 (若有异议请与网页底部的电邮联系)
C++两个运算符重载函数为什么不能都重载为成员函数~

参数问题吧,一般"+"为双目运算符

试想一下这一点:
将我们的类派生于ostream,也就是做为流类的子类,这样,不就可以将插入运算符声明为成员函数,并且用法也与友元方式下一样了吗?
那么为什么还要声明为友元呢?原因上面回答者也说了一些。。。
不能重载的根本原因在于,
大部份的标准库实现中,对ostream,istream类体系采用了构造函数保护继承的方式。。。致使即使以继承的方式来扩展流类,也会在对象实例化时遭遇阻碍。。。
另一方面,标准库中的流类,其插入符函数没有声明为虚函数,因此子类不能对其实现进行覆盖,所以也使成员函数重载遭遇到实质的困难。。。
总的来说,C++标准I/O库非常繁杂且难,其实现思想很多都与常规的OOP有所出入。。。在使用的时候要谨慎,并最好遵从惯例。。。

对于同一个类的两个成员是不能互相访问私有数据的.
但也涉及到一个说法问题

假设这个类为
class Classtest{
private:
int value;

public:
//两个构造函数 :
Classtest()
Classtest(int j)
//设置,和取值函数 :
void setvalue(int val)
int getvalue()
//重载加法操作符 :
Classtest operator +(Classtest&b){
return Classtest(this->value+b.value);
}
};

A+B
可以获得结果是因为执行了A.operator+(B);
该函数是A的成员函数所以可以直接访问A的私有数据
由于在类内 所以B也可以访问自己的私有数据.
但不是A在访问B的私有数据.
注意这句话
int operator +(Classtest&b)
对于B是通过b.value获得值,对于this是通过直接访问变量value来获得的.
如果在类外调用B.value;就会出错
因为类外B无法访问自己的私有数据,只能调用B的公有成员函数(该函数是类内的代码,所以他可以访问类的私有数据)
------------------------------
#include <stdio.h>
#include <stdlib.h>
class Classtest{
private:
int value;

public:
//两个构造函数 :
Classtest()
Classtest(int j)
//设置,和取值函数 :
void setvalue(int val)
int getvalue()
//重载加法操作符 :
Classtest operator +(Classtest&b){
return Classtest(this->value+b.value)//这个地方也可以使用b.getvalue();;
}
};

int main(void)
{
class Classtest j,b;
j.setvalue(2);
b.setvalue(4);
printf("%d\n",(j+b).getvalue());
;system("pause");

}


可以 呀。。。怎么不可以???你的代码出现 了不可以的情况??
比如实数类,对于+、-、=都要重载,怎么可能只能重载一个呢。。


C选项中为什么“不能减少产热”
简单的说,产热是为了生命所需,最基本的生命活动需要系统产热供应 ,故C项不能选。

c语言中的乘法为什么不能直接用2^3实现?
6、应用软件,由于C语言没有成熟的开发框架,所以不适合开发大型应用程序。但也有一些对效率要求比较高的程序使用C语言开发,如Git。

为什么C语言不能像c++一样直接操作字符串?
C语言中字符串与一般字符数组的最大区别在于:字符串常量的最后由系统加上一个'\\0',而字符数组不会添加。字符串能通过scanf()、printf()等函数进行整体的读写。C语言中没有字符串类型,字符串是存放在字符型数组中的。在C语言中,是将字符串作为字符数组来处理的。为了测定字符串的实际长度,C语言...

c语言中,为什么不能对字符指针变量指向的字符串再赋值?
因为C语言中,凡是以""括住的形式直接出现,而且你又没有为其分配内存空间的字符串都是常量字符串,是不能修改其值的。这样:char a[6]="hello";a[2]='c';就可以了。这里你为hello分配了一个长度为6的字符数组空间来存放。

为什么c语言不能用指针?
C语言里,所有变量空间都是在程序运行之初向系统申请的,包括指针,除了一些动态申请方式如malloc函数。没有申请的空间系统是不允许读写的。那么如果一个数组大小是变量定义,则在程序运行前不能确定数组大小,也就无法申请,故不允许。所以,解决的办法便是通过malloc函数,即 int a[n];可改为 int* ...

C语言为什么一个字符也不能输入。
在C语言中,一个字符也是可以输入的。然而,如果您遇到了无法输入字符的情况,可能是由于以下原因之一:输入缓冲区问题:当您使用标准输入函数(如scanf())来获取用户输入时,输入的字符会被缓存在输入缓冲区中,直到被读取。如果输入缓冲区中还有其他未读取的字符,可能会导致无法输入新的字符。这种情况下...

为什么有些代码在.cpp中可以运行而在.c中却不能运行
因为一般编译器是根据文件类型来判断是C还是C++程序,它们将.cpp作为C++源程序处理,而将.c作为C语言源程序处理。而C++语言一般可以认为是C语言的超集,也就是说有些语法是只有C++才有的,而C语言是没有用的。所以才会出现有些程序(实际上就是C++程序)不能够使用.C后缀。

c语言为什么不能用sizeof?
sizeof肯定可以用,一般说不能用的应该是对sizeof的作用有无解,例如用sizeof来计算字符串尺寸就是典型错误

C语言 里为什么不能 (a++)++
因为++操作符的对象是可修改的左值,就好象 a += 1一样,是可以赋值的变量,但是a++本身是一个表达式,是一个右值(比如a += 1中的1),不可修改,所以(a++)++试图改变一个非变量的值,编译后会出错

c语言中数组为什么不可改变大小?
首先C语言里面的数组,一旦定义好了,是无法改变类型和长度的,也不是指针,不能改变指向的内容,所以如下这种写法 int a[10], b[10];a = b;是无法编译的。在其他语言里,比如java,c#,javascript,python等等等等,数组都是作为对象来使用的 可以写a=b,那么a原来表示的数组就被抛弃了,a和b...

海勃湾区13716954447: 在C++中为什么不能把两个运算符重载都作为成员函数 -
富东醋酸: 对于同一个类的两个成员是不能互相访问私有数据的. 但也涉及到一个说法问题假设这个类为 class Classtest{ private: int value;public: //两个构造函数 : Classtest() Classtest(int j) //设置,和取值函数 : void setvalue(int val) int getvalue() //重...

海勃湾区13716954447: C++中可以重载哪些运算符,不可以重载哪些运算符,说明不可以重载的原因? -
富东醋酸: c++规定'.', '::', '.*', '.->' , '? :'只有这五种运算符是不能重载,其余是能重载的.这是规定没什么原因啊

海勃湾区13716954447: C++中有哪些运算符不能重载 -
富东醋酸: 很简单, 运算符 如+ - * / 等,两边的数据类型是可以变化的, 如1+1 对应的是 int型 1.0+1.0 对应的是float型 两个式子调用的程序是不一样的,但用的都是同一个运算符,这就是重载 你自己写的类也可以用到这些运算符, 只要重载你用到的运算符自己写算法就可以了

海勃湾区13716954447: C++两个运算符重载函数为什么不能都重载为成员函数 -
富东醋酸: 重载为成员函数需要第一个参数是当前对象的类型吧

海勃湾区13716954447: C++中不能重载的运算符,有哪几个?谢谢 -
富东醋酸: 重载操作符的限制: 8.1 并不是所有的操作符都能被重载.除了. ,.* ,:: ,? : ,sizeof,typeid这几个运算符不能被重载,其他运算符都能被重载 8.2 重载不能改变该运算符用于内置类型时的函义,程序员不能改变运算符+用于两个int型时的含义. 8.3 运算符函数的参数至少有一个必须是类的对象或者类的对象的引用.这种规定可以防止程序员运用运算符改变内置类型的函义. 8.4 重载不能改变运算符的优先级. 8.5 重载不能改变运算符的结合律. 8.6 重载不能改变运算符操作数的个数.比如+需要两个操作数,则重载的+也必须要有两个操作数.

海勃湾区13716954447: 在C++中有哪些运算符不可以重载的? -
富东醋酸: 大部分的操作符是可以被重载的,例外的只有“.”、“::”、“?:”和“sizeof”.没有什么非禁止operator?:重载的理由,只不过没有必要而已.另外,expr1?expr2:expr3的重载函数无法保证expr2和expr3中只有一个被执行. 而“sizeof”无...

海勃湾区13716954447: c++重载运算符
富东醋酸: C++中预定义的运算符其运算对象只能是基本数据类型,而不适用于用户自定义类型(如类).// 同上,内置的运算符 只能应用于内置的数据类型 ...比如 int char double .等等.(一) C++不允许用户自己定义新的运算符,只能对已有的C++运算...

海勃湾区13716954447: C++中双目运算符重载只能有一个参数吗? -
富东醋酸: 两个参数,比如重载 + int operator +(int a, int b); 这样写

海勃湾区13716954447: C++中“.”符号不能重载吧? -
富东醋酸: 如果你重载的话在编译的时候会看到这样的提示:error C2800: 'operator .' cannot be overloaded 不可重载的运算符集合:{.,.*,::,?:}

海勃湾区13716954447: C++中哪些运算符不可重载 -
富东醋酸: 下列运算符不允许重载:. , .* , :: , ?:,siezof

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网