C++运算符的多态问题 C语言三目运算符问题。

作者&投稿:融饺 (若有异议请与网页底部的电邮联系)
如楼主所言,是友元函数,友元函数的访问权限如同普通成员函数

友元函数的定义,就是可以访问类的私有成员啊。

这不行,cannot access private member declared in class“complex”;

什么叫做多态性 ?在C++中是如何实现多态的?~

C++中的多态(虽然多态不是C++所特有的,但是C++中的多态确实是很特殊的)分为静多态和动多态(也就是静态绑定和动态绑定两种现象),静动的区别主要在于这种绑定发生在编译期还是运行期,发生在编译期的是静态绑定,也就是静多态;发生在运行期的则是动态绑定,也就是动多态。

静多态可以通过模板和函数重载来实现(之所说C++中的多态主要还是因为模板这个东西),下面举两个例子:
1)函数模板
template
T max(const T& lsh, const T& rhs)
{
return (lsh > rhs) ? lsh : rhs;
}
返回两个任意类型对象的最大值(对象),前提是该类型能够使用>运算符进行比较,并且返回值是bool类型。
使用:
int a = 3; int b = 4;
cout << max(a, b) << endl;
float c = 2.4; float d = 1.2;
cout << max(c, d) << endl;
输出结果为:
4
2.4
这种绑定发生在编译期,这是由于模板的实例化是发生在编译期的,即在编译时编译器发现你调用max(a, b)时就自动生成一个函数
int max(const int& lsh, const int& rhs)
{
return (lsh > rhs) ? lsh : rhs;
}
即将所有的T替换成int;
当你调用max(c, d)时就自动生成一个函数
float max(const float& lsh, const float& rhs)
{
return (lsh > rhs) ? lsh : rhs;
}
之所以说开始的函数定义是函数模板,就是因为他就像个模子似的,你可以用铝作为原料也可以用石膏或者铜。
2)函数重载:
int max (int a, int b)
{
return (a > b) ? a : b;
}
int max (int a, int b, int c)
{
return max(max(a, b), c);
}
两个函数名称一样,参数类型或个数不完全相同,返回值一样(这个不重要)。
使用:
int a = 3, b = 4, c = 5;
cout << max(a, b) << endl;
cout << max(a, b, c) << endl;
输出结果为:
4
5
确定函数的过程也发生在编译器,当你使用max(a, b),编译器发现只有两个参数,那么就调用只有两个参数的函数版本,当使用max(a, b, c)时,编译器则使用有3个参数的版本。
通过上面的两个例子,你还可以使用更为方便的模板函数重载:
template
T max(const T& lsh, const T& rhs)
{
return (lsh > rhs) ? lsh : rhs;
}

template
T max(const T& a, const T& b, const T& c)
{
return max(max(a, b), c);
}
使用
float a = 3.6, b = 1.2, c = 7.8;
cout << max(a, b, c) << endl;
输出:
7.8
通过参数个数和类型,编译器自动生成和调用对应得函数版本!

动多态则是通过继承、虚函数(virtual)、指针来实现。
class A {
public:
virtual void func() const {
coust << “A::func()” << endl;
}
}

class B : public A {
public:
virtual void func() const {
coust << “B::func()” << endl;
}
}
使用:
A a* = B();
a->func();
输出:
B::func()
编译期是不调用任何函数的,编译器编译到a->func()时只是检查有没有语法问题,经过检查没有。编译器并不知道调用的是A版本的func()还是B版本的func(),由于a是一个指向B对象的指针,所以a只知道它指向的是一个A类型(或者能转换成A类型)的对象。通常集成体系就说明了(由于是公有继承)B是一种A。在运行期,a要调用a所指向对象的func()函数,就对它指向的对象下达调用func()的命令,结果a所指向的是一个B对象,这个对象就调用了自己版本(B版)的func()函数,所以输出时B::func()

总结:
在编译期决定你应该调用哪个函数的行为是静态绑定(static-binding),这种现象就是静多态。
在运行期决定应该调用哪中类型对象的函数的行为是动态绑定(dynamic-binding),这种现象就是动多态!

注:由于这是我花了有限的时间总结的,语言应用能力比较差,还有比如类模板(静多态和动多态组合的情况)都没有说,最近比较忙,请见谅!

如果还不是很懂,我建议你看C++Primer 4th Edition,讲的比较清晰,但是比较零散!

如果y值为0则输出的是后面的“no”然后回车,如果不为0则直接输出回车。判断语句中0为假。不为0为真。

C++ 单目运算符 ++ 重载多态问题
答:1:前置即++a,是可以做左值的,因此返回时是*this,比如说++(++a)时如果不是返回的是*this第二次++就不可能应用在a身上。2:因为如果直接用就不是后置的含义了,后置是先将变量的值做为表达式的值确定下来,再将变量加一,这是原本后置运算含义,如果如同你写的:Clock Clock:: operator ++(int...

运算符重载是多态性的一种表现
答:1、运算符重载,就是对已有的运算符重新进行定义,赋予其另一种功能,以适应不同的数据类型。2、运算符重载可以实现多态性,但它本身并不是多态性的一种表现。多态性是指在不同情况下同一个对象或方法可以表现出不同的形态或行为。运算符重载可以让不同类型的对象使用相同的操作符,从而表现出不同的...

C++运算符的多态问题
答:如楼主所言,是友元函数,友元函数的访问权限如同普通成员函数

Python中的多态?
答:因为Python是动态类型语言,所以多态在Python中随处可见。事实上,在 Python中所有操作都是多态的操作:print、index、*运算符,以及更多。这实际上是有意而为的,并且从很大程度上算作是这门语言简洁性和灵活性的一个表现。例如,函数可以自动地应用到所有类别的对象上。只要对象支持所预期的接口(也称为...

c++的所有运算符都可以重载吗?
答:大多数C++运算符可以重载。运算符重载是一种形式的C++多态。运算符重载将重载的概念扩展到运算符上,允许赋予C++运算符多种含义。单目运算符重载:单目运算符只有一个操作数,如!a,-b,&c,*p,还有最常用的++i和--i等。由于单目运算符只有一个操作数,因此运算符重载函数只有一个参数,如果运算符...

在JAVA中有两种多态指的是什么
答:在JAVA中有两种多态是指:运行时多态和编译时多态。关于类的多态性简介如下:多态(polymorphism)意为一个名字可具有多种语义.在程序设计语言中,多态性是指”一种定义,多种实现”.例如,运算符+有多种含义,究竟执行哪种运算取决于参加运算的操作数类型:1+2 //加法运算符 “1” + “2” //字符串...

什么叫做多态性 ?在C++中是如何实现多态的?
答:静多态可以通过模板和函数重载来实现(之所说C++中的多态主要还是因为模板这个东西),下面举两个例子:1)函数模板 template <typename T> T max(const T& lsh, const T& rhs){ return (lsh > rhs) ? lsh : rhs;} 返回两个任意类型对象的最大值(对象),前提是该类型能够使用>运算符进行...

如何实现函数运算符重载
答:3.运算符重载称动态多态性,他是通过继承和虚函数实现的。运算符重载通过创建运算符函数operator@()来实现。运算符函数定义了重载的运算符将要进行的操作,这种操作通常作用在一个类上。这样,在编译时遇到名为operator@的运算符函数(@表示所要重载的运算符),就检查传递给函数的参数的类型。重载运算符...

C++静态多态是什么意思?
答:C++中的多态可分为静态多态和动态多态,这两种形式的多态在实现机制上有着本质的差别。1、静态多态可以称为编译期多态,它是在编译期间通过函数重载和运算符重载的方式决定被调用函数的。2、动态多态可以称为运行期多态,它可以通过继承和虚函数来实现。实现时,编译器将在进程运行的过程中动态的捆绑想要...

1. 编译时的多态性与运行时的多态性有什么区别,他们的实现方法有什么不...
答:运行时的多态性:就是指直到系统运行时,才根据实际情况决定实现何种操作。1、多态实现形式不同:编译时的多态是通过静态连编来实现的;运行时的多态是用动态连编来实现的。2、多态性通过方式不同:编译时的多态性主要是通过函数重载和运算符重载来实现的;运行时的多态性主要是通过虚函数来实现的。