//1 运算符重载 #include <iostream> using namespace std; class num { public: num(){ n=1;} ~num(){} int get()const{ return n;} void set(int x){ n = x;} private: int n; }; int main() { num n; n.set(11); cout<<n.get()<<endl; //n++; return 0; } /* //2 在成员函数中实现自加 #include <iostream> using namespace std; class num { public: num(){ n=1;} ~num(){} int get()const{ return n;} void set(int x){ n = x;} void add(){ ++n; } private: int n; }; int main() { num n; n.set(11); cout<<n.get()<<endl; //n++; n.add(); cout<<n.get()<<endl; return 0; } */ /* // 3 重载前置自加运算符 #include <iostream> using namespace std; class num { public: num(){ n=1;} ~num(){} int get()const{ return n;} void set(int x){ n = x;} void add(){ ++n; } void operator++(){ ++n;} private: int n; }; int main() { num n; n.set(11); cout<<n.get()<<endl; //n++; //n.add(); ++n; cout<<n.get()<<endl; return 0; } */ // 4 重载前置自加运算符 /* #include <iostream> using namespace std; class num { public: num(){ n=1;} ~num(){} int get()const{ return n;} void set(int x){ n = x;} void add(){ ++n; } void operator++(){ ++n;} private: int n; }; int main() { num n; n.set(11); cout<<n.get()<<endl; //n++; //n.add(); //++n; //num i = ++n; cout<<n.get()<<endl; return 0; } */ /* //5 创建临时对像 #include <iostream> using namespace std; class num { public: num(){ n=1;} ~num(){} int get()const{ return n;} void set(int x){ n = x;} void add(){ ++n; } num operator++() { ++n; num t; t.set(n); return t; } private: int n; }; int main() { num n; n.set(11); cout<<"n:"<<n.get()<<endl; //n++; n.add(); num i = ++n; cout<<"i:"<<i.get()<<endl; return 0; } */ // 6 创建无名临时对像 /*#include <iostream> using namespace std; class num { public: num(){ n=1; cout<<"构造函数执行"<<endl;} num(int i){ n = i; cout<<"带参数的构造函数"<<endl;} ~num(){ cout<<"析构函数执行"<<endl;} int get()const{ return n;} void set(int x){ n = x;} void add(){ ++n; } num operator++() { ++n; return num(n); //这里返回一个创建的无名临时对像,他执行的是一个带参数的构造函数 //num t; //t.set(n); //return t; } private: int n; }; int main() { num n; n.set(11); cout<<"n:"<<n.get()<<endl; //n++; n.add(); num i = ++n; cout<<"i:"<<i.get()<<endl; return 0; }*/ /* #include <iostream> using namespace std; class num { public: num(){ n=1; cout<<"构造函数执行"<<endl;} num(int i){ n = i; cout<<"带参数的构造函数"<<endl;} ~num(){ cout<<"析构函数执行"<<endl;} num(const num&s){ this->n = s.n; cout<<"这里执行了带参数的复制构造函数"<<endl;} int get()const{ return n;} void set(int x){ n = x;} void add(){ ++n; } num operator++() { ++n; return *this; //这里其实是进行了复制构造函数 //return num(n); //num t; //t.set(n); //return t; } //重载后执自加运算符 const num operator++(int o) { num temp(*this); //临时对像, *this表示operator++进行自加的当前对像 //++n; //这里的n是指原实对像的n,也就是this对像的n this->n++; //与上等同 ++n; return temp; //然后我们把临时对像返回去 } private: int n; }; int main() { num i; cout<<"i:"<<i.get()<<endl; i.add(); cout<<"i:"<<i.get()<<endl; num n = i++; cout<<"i:"<<i.get()<<endl; cout<<"n:"<<n.get()<<endl; //num n = i++; return 0; }*/ // 7 取消创建临时对象 /*#include <iostream> using namespace std; class num { public: num(){ n=1; cout<<"构造函数执行"<<endl;} num(int i){ n = i; cout<<"带参数的构造函数"<<endl;} ~num(){ cout<<"析构函数执行"<<endl;} num(const num&s){ this->n = s.n; cout<<"这里执行了带参数的复制构造函数"<<endl;} int get()const{ return n;} void set(int x){ n = x;} void add(){ ++n; } num operator++() { ++n; return *this; //这里其实是进行了复制构造函数 //return num(n); //num t; //t.set(n); //return t; } private: int n; }; int main() { num n; n.set(11); cout<<"n:"<<n.get()<<endl; //n++; n.add(); num i = ++n; //这里进行重载运算符 cout<<"i:"<<i.get()<<endl; return 0; }*/ //9 重载后置自加运算 //如果x=1 // y = ++x; 执行完以后,x y 都等于2 // 前执自加是先将++x执行,然后赋值给y // y = x++; // 而后执自加是先将x赋值给y, 然后进行x++ // 那么这里的x = 2; y = 1; /*#include <iostream> using namespace std; int main() { int i= 1; int y, x; y = ++i; cout<<"i:"<<i<<", y:"<<y<<endl; i = 1; x = i ++; cout<<"i:"<<i<<", x:"<<x<<endl; return 0; }*/ //后执自加 /*#include <iostream> using namespace std; class num { public: num(){ n=1; cout<<"构造函数执行"<<endl;} num(int i){ n = i; cout<<"带参数的构造函数"<<endl;} ~num(){ cout<<"析构函数执行"<<endl;} num(const num&s){ this->n = s.n; cout<<"这里执行了带参数的复制构造函数"<<endl;} int get()const{ return n;} void set(int x){ n = x;} void add(){ ++n; } num operator++() { ++n; return *this; //这里其实是进行了复制构造函数 //return num(n); //num t; //t.set(n); //return t; } //重载后执自加运算符 const num operator++(int o) { num temp(*this); //临时对像, *this表示operator++进行自加的当前对像 //++n; //这里的n是指原实对像的n,也就是this对像的n this->n++; //与上等同 ++n; return temp; //然后我们把临时对像返回去 } private: int n; }; int main() { num i; cout<<"i:"<<i.get()<<endl; i.add(); cout<<"i:"<<i.get()<<endl; num n = i++; cout<<"i:"<<i.get()<<endl; cout<<"n:"<<n.get()<<endl; //num n = i++; return 0; }*/ //10 重载加法运算符函数 /*既然使用关键字operator配合运算符++可以实现对像的自加,那么关键字operator配合运算符+就可以实现将对像相加,本节我们就来学习 一下重载加法运算符operator+,减法运算符的道理与加法相同,这里就不多说了 在使用operator+之前我们先来看如查没有加运算符,比如说我们定义了两个对像sum a, b; 然后将这两个对像相加的结果赋给第三个对像 sum c = a+b; 我们要实现这样的操作仍然要定义一个add()函数,该函数被对像a所调用,然后在函数中将对像b作为参数传递到add()函数中去 然后在函数中将两上对像的成员变量相加,并将结果传递到构造函数中,最后返回这个构造函数,该函数的胚体写法与调用如下 */ /* #include <iostream> using namespace std; class num { public: num(){ n=1; cout<<"构造函数执行"<<endl;} num(int i){ n = i; cout<<"带参数的构造函数"<<endl;} ~num(){ cout<<"析构函数执行"<<endl;} num(const num&s){ this->n = s.n; cout<<"这里执行了带参数的复制构造函数"<<endl;} int get()const{ return n;} void set(int x){ n = x;} void add(){ ++n; } num add(const num&x){ return num(this->n + x.n); } num operator++() { ++n; return *this; //这里其实是进行了复制构造函数 //return num(n); //num t; //t.set(n); //return t; } //重载后执自加运算符 const num operator++(int o) { num temp(*this); //临时对像, *this表示operator++进行自加的当前对像 //++n; //这里的n是指原实对像的n,也就是this对像的n this->n++; //与上等同 ++n; return temp; //然后我们把临时对像返回去 } private: int n; }; int main() { num one(1), two(2), three; three = one.add(two); cout<<"one:"<<one.get()<<endl; cout<<"two:"<<two.get()<<endl; cout<<"three:"<<three.get()<<endl; return 0; }*/ // 重载加法运算符函数 /* #include <iostream> using namespace std; class num { public: num(){ n=1; cout<<"构造函数执行"<<endl;} num(int i){ n = i; cout<<"带参数的构造函数"<<endl;} ~num(){ cout<<"析构函数执行"<<endl;} num(const num&s){ this->n = s.n; cout<<"这里执行了带参数的复制构造函数"<<endl;} int get()const{ return n;} void set(int x){ n = x;} void add(){ ++n; } num add(const num&x){ return num(this->n + x.n); } //重载+运算符,对两个对像进行相加操作 const num operator+(const num &x){ return (this->n + x.n); } const num operator-(const num &x){ return (this->n - x.n); } num operator++() { ++n; return *this; //这里其实是进行了复制构造函数 } //重载后执自加运算符 const num operator++(int o) { num temp(*this); //临时对像, *this表示operator++进行自加的当前对像 //++n; //这里的n是指原实对像的n,也就是this对像的n this->n++; //与上等同 ++n; return temp; //然后我们把临时对像返回去 } private: int n; }; int main() { num one(1), two(2), three; //three = one + two; //three = one.add(two); three = one - two; cout<<"one:"<<one.get()<<endl; cout<<"two:"<<two.get()<<endl; cout<<"three:"<<three.get()<<endl; return 0; }*/ // 12 重载赋值运算函数operator=\ /* #include <iostream> using namespace std; class num { public: num(){ n=1; cout<<"构造函数执行"<<endl;} num(int i){ n = i; cout<<"带参数的构造函数"<<endl;} ~num(){ cout<<"析构函数执行"<<endl;} num(const num&s){ this->n = s.n; cout<<"这里执行了带参数的复制构造函数"<<endl;} int get()const{ return n;} void set(int x){ n = x;} void add(){ ++n; } num add(const num&x){ return num(this->n + x.n); } //重载+运算符,对两个对像进行相加操作 const num operator+(const num &x){ return (this->n + x.n); } const num operator-(const num &x){ return (this->n - x.n); } const num equal(const num&x){ this->n = x.get(); return *this; } const num operator=(const num&x){ if(this == &x){ return *this; } cout<<"operator=函数在调用"<<endl; this->n = x.get(); return *this; } num operator++() { ++n; return *this; //这里其实是进行了复制构造函数 } //重载后执自加运算符 const num operator++(int o) { num temp(*this); //临时对像, *this表示operator++进行自加的当前对像 //++n; //这里的n是指原实对像的n,也就是this对像的n this->n++; //与上等同 ++n; return temp; //然后我们把临时对像返回去 } //赋值=运算符重载 private: int n; }; int main() { num one(1), two(2), three; //three = one + two; //three = one.add(two); //three = one - two; //one.equal(two); //one = two; cout<<"one:"<<one.get()<<endl; cout<<"two:"<<two.get()<<endl; cout<<"three:"<<three.get()<<endl; return 0; }*/ // 18 转换类型运算符 /*#include <iostream> using namespace std; class A { public: A(int x){ i = x; cout<<"构造函数执行"<<i<<endl;} //如果调用带两个参数的构造函数将产生错误 //A(int x, int y){ i = x; cout<<"构造函数执行"<<i<<endl;} ~A(){cout<<"析构造函数执行"<<i<<endl;} void get(){ cout<<i<<endl;} private: int i; }; int main() { A a(33); a.get(); a = 1000; //在将1000赋值给a时,执行带一个参数的构造函数,会生成一个临时的对像,然后调用析构函数 a.get(); a = A(2); //强制类型表达式, 将2转换成A 的值 return 0; }*/ /* #include <iostream> using namespace std; class A { public: A(int x){ i = x; cout<<"构造函数执行"<<i<<endl;} //如果调用带两个参数的构造函数将产生错误 //A(int x, int y){ i = x; cout<<"构造函数执行"<<i<<endl;} ~A(){cout<<"析构造函数执行"<<i<<endl;} void get(){ cout<<i<<endl;} operator int(){ return i;} private: int i; }; int main() { A a(33); a.get(); int x = 999; x = a; a.get(); cout<<x<<endl; return 0; }*/ #include <iostream> using namespace std; class A { public: A(int x){i=x;cout<<"构造函数执行!"<<i<<endl;} ~A(){cout<<"析构函数执行!"<<i<<endl;} void get(){cout<<i<<endl;} operator int() { cout<<"operator int"<<i<<endl; return i; } private: int i; }; struct B { int a; B(int i):a(i){} //重载运算符int,可以将类进行类型换转为int型 operator int() const { return a; } }; int main() { A a(33); a.get(); int x=999; x=a; B aa(22); int i = int(aa); int j = aa; cout<<"i:"<<i<<endl; cout<<"j:"<<aa<<endl; //作用一样; //a.get(); //cout<<endl; //cout<<x<<endl; return 0; }