#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<string>
using namespace std;
struct Mode2; //当两个结构体相互友元时,注意未出现结构体的声明
struct Mode{
private:
char * n;
public:
Mode(); //构造函数与析构函数是没有返回值的
~Mode();
void set_n(char * );
void get_n();
Mode operator ++(int); //要用用int型
Mode operator +(char *);
void show(Mode2 &);
friend Mode operator +(char *, Mode &);
friend Mode operator ++(Mode &); //非成员函数的重载要用类类型或者枚举型
friend struct Mode2;
};
struct Mode2
{
private:
int num;
public:
void show(Mode& );
friend struct Mode;
};
Mode::Mode() {
cout << "Mode" << endl;
}
Mode::~Mode() {
cout << "~Mode" << endl;
}
void Mode::set_n(char * ch) {
n = ch;
}
void Mode::get_n() {
cout << "Mode.n : " << n << endl;
}
Mode Mode::operator+(char * ch) { //写在函数内部的函数重载的前提是左边操作数的类型是类类型的
strcat(n, ch);
return *this;
}
Mode Mode::operator++(int ) { //后++返回之前的数据,但是本身在变化
Mode temp = *this; //this 是一个指向自己的指针,返回它的值
int len = strlen(n); //这里用strlen得到字符数组的具体长度而不是它一共所占的空间,指针的大小是4个字节,char是一个
cout <<"len:"<< len << endl;
for (int i = 0; i < len; i++) {
n[i] += 1;
}
return temp;
}
Mode operator +(char *ch, Mode &m) { //当操作数的类型不是类类型的时候,应该写在函数的外面
strcat(ch, m.n);
return m;
}
Mode operator ++(Mode &m ) { //前++
int len = strlen(m.n);
cout << "m.n : " << len << endl;
for (int i = 0; i < len; i++) {
m.n[i] += 1;
}
return m;
}
void Mode2::show(Mode & a) {
a.n = "qqqq";
cout << "n : "<<a.n << endl;
}
void Mode::show(Mode2 & a) {
a.num = 33;
cout << "num : " <<a.num<< endl;
}
int main() {
Mode m1;
Mode2 m2;
char *p = new char[100];
cout << "请输入一段字符串:" << endl;
cin >> p;
m1.set_n(p);
m1.get_n();
m1++;
m1.get_n();
++m1;
m1.get_n(); //无论前++还是后++由于函数返回的都是改变以后的值,所以两个的返回值偶增加了
m2.show(m1);
delete p;
p = NULL; //动态分配的内存要记得用完后销毁掉
return 0;
#include<iostream>
#include<string>
using namespace std;
struct Mode2; //当两个结构体相互友元时,注意未出现结构体的声明
struct Mode{
private:
char * n;
public:
Mode(); //构造函数与析构函数是没有返回值的
~Mode();
void set_n(char * );
void get_n();
Mode operator ++(int); //要用用int型
Mode operator +(char *);
void show(Mode2 &);
friend Mode operator +(char *, Mode &);
friend Mode operator ++(Mode &); //非成员函数的重载要用类类型或者枚举型
friend struct Mode2;
};
struct Mode2
{
private:
int num;
public:
void show(Mode& );
friend struct Mode;
};
Mode::Mode() {
cout << "Mode" << endl;
}
Mode::~Mode() {
cout << "~Mode" << endl;
}
void Mode::set_n(char * ch) {
n = ch;
}
void Mode::get_n() {
cout << "Mode.n : " << n << endl;
}
Mode Mode::operator+(char * ch) { //写在函数内部的函数重载的前提是左边操作数的类型是类类型的
strcat(n, ch);
return *this;
}
Mode Mode::operator++(int ) { //后++返回之前的数据,但是本身在变化
Mode temp = *this; //this 是一个指向自己的指针,返回它的值
int len = strlen(n); //这里用strlen得到字符数组的具体长度而不是它一共所占的空间,指针的大小是4个字节,char是一个
cout <<"len:"<< len << endl;
for (int i = 0; i < len; i++) {
n[i] += 1;
}
return temp;
}
Mode operator +(char *ch, Mode &m) { //当操作数的类型不是类类型的时候,应该写在函数的外面
strcat(ch, m.n);
return m;
}
Mode operator ++(Mode &m ) { //前++
int len = strlen(m.n);
cout << "m.n : " << len << endl;
for (int i = 0; i < len; i++) {
m.n[i] += 1;
}
return m;
}
void Mode2::show(Mode & a) {
a.n = "qqqq";
cout << "n : "<<a.n << endl;
}
void Mode::show(Mode2 & a) {
a.num = 33;
cout << "num : " <<a.num<< endl;
}
int main() {
Mode m1;
Mode2 m2;
char *p = new char[100];
cout << "请输入一段字符串:" << endl;
cin >> p;
m1.set_n(p);
m1.get_n();
m1++;
m1.get_n();
++m1;
m1.get_n(); //无论前++还是后++由于函数返回的都是改变以后的值,所以两个的返回值偶增加了
m2.show(m1);
delete p;
p = NULL; //动态分配的内存要记得用完后销毁掉
return 0;
}