为啥把友元和多态放在一起,因为多态里的重载正好用到友元了。
友元:
第一部分:函数的友元
#include <iostream>
using namespace std;
class A
{
public:
A()
{
a=1;
}
friend A show(A &x) //要注意的点在于friend不是用来定义函数类型的,依旧得写void。<span style="white-space:pre"> </span>其次要注意加上&这个符号。
{
cout<<x.a<<endl;
}
private:
int a;
};
int main()
{
A a;
show(a);<span style="white-space:pre"> </span>//友元可以直接当作函数调用,但是括号里面要写类。
}
第二部分:类的友元(个人感觉作用不大,因为用继承就行了,这个很麻烦,逻辑我说不明白。)
#include <iostream>
using namespace std;
class A
{
public:
A()
{
a=1;
}
friend class B;
private:
int a;
};
class B
{
public:
void show(A &x)
{
cout<<x.a<<endl;
}
};
int main()
{
A a;
B b;
b.show(a);
}
多态:
第一部分:重载
1.类的加减乘除(有两种方法,一个是operator前用类,一个是用friend)
////////////////////////////// 类
#include <iostream>
using namespace std;
class A
{
public:
A(int x)
{
a=x;
}
A operator+(A x) //加法就是这么写的,括号里只有一个(这里代表b)。
{
return A(a+x.a);
}
void show()
{
cout<<a<<endl;
}
private:
int a;
};
int main()
{
A a(10),b(20);
a=a+b;
a.show();
return 0;
}
/////////////////////////////////// 友元
#include <iostream>
using namespace std;
class A
{
public:
A(int x)
{
a=x;
}
friend A operator+(A x,A y) //加法就是这么写的(书上在x和y前加&但是我看不懂啥意思,去掉并不影响),注意括号里变成了两个,前面加了friend。
{
return A(x.a+y.a);
}
void show()
{
cout<<a<<endl;
}
private:
int a;
};
int main()
{
A a(10),b(20);
a=a+b;
a.show();
return 0;
}
2.除了重载的加减乘除,经常用的重载
//////////////////////////////////// "" -> ""
定义一个类直接调用它的函数就可以,干嘛弄这个,有毛病。
///////////////////////////////////"" [] "" 这个是下标(注意[]这个符号是用来访问的,不是新建的)。
#include<iostream>
#include<string.h>
using namespace std;
class A
{
public:
A(char* x)
{
num=strlen(x);
t=new char[num+1];
strcpy(t,x);
}
char operator[](int x)
{
return t[x];
}
private:
int num;
char *t;
};
int main()
{
A z("abcdefg");
cout<<z[2]<<endl;
return 0;
}
第二部分:虚函数
看书上看了半天,本以为是高大上,结果竟然是继承的重写(进我博客的继承里看),哎呦,这群编书的。
第三部分:抽象函数
不会,用到再说。