C++ 面向对象- -一些简单练习(一)

mac2022-06-30  20

这里边是我自己在下边学的时候练习的一些代码,有的简单,有的比较实用,我在前面建个目录,大家有想看的就直接根据目录找吧,直接放代码了。

目录

1、结构体与类

2、类的简单使用

3、变量间的引用

4、析构函数的使用

5、有默认参数的构造函数

6、转换构造函数-实复数相加

7、流提取运算符的重载

8、实复数的加减-运算符的重载

9、复数相加-无运算符重载

10、重载输出流运算符

11、复数相加-运算符的重载

12、单目运算符的重载-前置或后置++


 

1、结构体与类

#include <iostream> using namespace std; struct Student{ //c++中允许用struct去定义类,但对于私有公有须作出声明。 //private : int num ; char sex ; }; int main() { Student s , *p; s.num = 6 ; p = &s ; //需作出这样的声明,不然指针不知道指向谁,就会出错。 p->sex = 's' ; cout << s.num <<endl; cout << p->sex <<endl; return 0; }

 

2、类的简单使用

#include <iostream> using namespace std; class Sturent { private : int num ; string name ; //char name1[10] ; int sorce ; public : void display() ; void set(); }; void Sturent::display(){ cout << "名次:" << num <<endl; cout << "名字:" << name <<endl; cout << "分数:" << sorce <<endl; //cout << name1 ; } void Sturent::set(){ cin >> num ; cin >> name ; //cin >> name1 ; cin >> sorce; } int main() { Sturent s ; s.set(); s.display(); return 0 ; }

 

3、变量间的引用

#include <iostream> using namespace std; int main() { int i; const int &a=i ; //可以用const对引用加以限定,不允许改变引用的值。 //但可以改变引用所代表的变量的值。 i=3 ; //a=2 ; const int &b=a ; // int &b=a ; cout << "i=" << i <<endl; cout << "b=" << b <<endl; i=1 ; cout << "a=" << a <<'\t'<< "i=" << i << '\t' << "b=" << b <<endl; cout <<endl ; //可以用常量或表达式对引用进行初始化,但必须用const作声明 。 const &o=i+5 ; //编译系统中的处理: int temp = i+5 ; 先将表达式的值存放在临时变量temp中 // const &o = temp ; 声明o是temp的别名 //这是在内部实现的,用户不能访问临时变量。 cout << "i=" << i << '\t' << "o=" << o <<endl; //可以利用这种方式实现数值间的类型转换。 double d=3.14 ; double &p=d ; int q ; q = (int)d ; //这是显式声明,不加也是整型,为隐式 cout << "d=" << d << '\t' << "p=" << p << '\t' << "q=" << q <<endl; return 0; }

 

4、析构函数的使用

#include <iostream> using namespace std ; class Time{ int hour ; int min ; int sec ; public: Time(int h ,int m , int s ) : hour(h),min(m),sec(s){cout << "Start ";} //根据输出显示,初始化表中的函数体部分先输出 //原因是在执行main函数时先建立了对象t1,在建立对象时调用了对象的构造函数 //故先输出cout的内容,然后调用对象的display函数,输出数值。 void display(){ cout << "时间: " << hour << ":" << min << ":" << sec << endl; } ~Time(){ //定义析构函数 cout << "End 释放空间?" <<hour << endl; //输出有关消息 //加这个hour是看调用析构函数的顺序。(先进后出) } }; int main() { Time t1(1,1,1) ; t1.display(); Time t2(0,0,0) ; t2.display(); return 0 ; }

 

5、有默认参数的构造函数

#include <iostream> using namespace std; class Time { int hour ; int min ; int sec ; public : Time(int h=0 , int m=0 , int s=0) ; void display(){ cout << "时间:" << hour << ":" << min << ":" << sec <<endl; } }; Time :: Time(int h , int m , int s){ hour = h ; min = m ; sec = s ; } int main() { Time t ; t.display(); Time t1(1) ; t1.display(); Time t2(1,2) ; t2.display(); Time t3(1,2,3) ; t3.display(); return 0; }

 

6、转换构造函数-实复数相加

#include <iostream> using namespace std; class Complex{ double real ; double imag ; public: Complex(){ //默认构造函数 无形参 real=0; imag=0; } Complex(double r,double i):real(r),imag(i){} //实现初始化的构造函数,两个形参 Complex(int i){ real=i; imag=0; } //转换构造函数 /*类型转换函数的使用很容易造成二义性,考虑函数间的共存问题。*/ friend Complex operator+(Complex ,Complex ); void show(){ cout << "(" << real << "+" << imag << "i)" <<endl; } }; Complex operator+(Complex a,Complex b){ return Complex(a.real+b.real,a.imag+b.imag) ; } int main(){ Complex c1(1,1) ,c0 , c3(3) ,c2 , c4; int i=4 ; cout << "c1= ";c1.show(); cout << "c0= ";c0.show(); cout << "c3= ";c3.show(); cout << "c2= "; c2=c1+c3 ;c2.show(); cout << "c4= "; c4=c2+i;c4.show();//注意!!!这样写的时候上边的+重载函数的形参不能用引用!!! //上下这两个之所以能够正常运行,是因为系统先用转换构造函数将建立一个临时对象Complex(i) c4=i+c0;c4.show(); //实复数的交换律适用于+重载函数作为友员函数声明,而若作为成员函数声明仍然不可交换顺序。 }

 

7、流提取运算符的重载

#include <iostream> using namespace std; class Complex{ double real; double imag; public: Complex (double r=0,double i=0):real(r),imag(i){} /*流提取运算符的第一个形参和函数类型都必须是 istream& , 和流插入运算符一样,都是为了能够持续输入输出,同样必须是作为友元函数。 */ friend istream& operator >> (istream& , Complex&); friend ostream& operator << (ostream& , Complex&); void display(){ cout << "(" << real << "," << imag << "i)" << endl; } Complex operator++(){ return Complex(real++,imag) ; } }; istream& operator >> (istream& input, Complex& c){ input >> c.real >> c.imag ; return input ; } ostream& operator << (ostream& output, Complex& c){ //这样写在输入虚数是负数时,会出错。 //output << "(" << c.real << "+" << c.imag << "i)" << endl; //作为程序员,应该多考虑到各个情况。 output << "(" << c.real ; if(c.imag>=0) output << "+" ; output<< c.imag << "i)" <<endl; } int main(){ Complex c1 , c2 ; cout << "c1= " ;c1.display(); cout<<"重新输入 c1:"<<endl; cin>>c1 ; cout << "c1="; cout<<c1 ; cout<<"输入 c2:"<<endl; cin>>c2; cout << c2 ; cout<<"c2自加后输出:"<<endl; ++c2 ; cout << c2 ; }

 

8、实复数的加减-运算符的重载

#include <iostream> using namespace std; class Complex{ double real ; double imag ; public: Complex(double r=0,double i=0):real(r),imag(i){} void display(){ cout << "输出复数: " <<endl; cout << "(" << real << "," << imag << "i)" << endl; } friend Complex operator+(int , Complex& ); //对+的二次重载,编译系统会根据 //表达式的形式选择调用与之匹配的运算符重载函数。 friend Complex operator+(Complex& , int ); }; Complex operator+(int i,Complex& a){ return Complex(i+a.real,a.imag) ; } Complex operator+(Complex& a,int i){ return Complex(i+a.real,a.imag) ; } int main(){ Complex C(1,2) , c2; C.display(); int i ; cout << "输入一个整数: " << endl; cin >> i ; c2=i+C ; c2.display(); cout << "再输入一个整数: " << endl; cin >> i ; c2=C+i ; c2.display(); }

9、复数相加-无运算符重载

#include <iostream> using namespace std; class Complex{ double real ; double imag ; public: Complex(double r=0,double i=0):real(r),imag(i){} Complex Complex_add(Complex &a); void display(); }; Complex Complex::Complex_add(Complex &a){ Complex c ; c.real=real+a.real ; c.imag=imag+a.imag ; return c ; } void Complex::display(){ cout << "(" << real << "," << imag << "i)" << endl; } int main() { Complex x1(1,1) , x2(2,2) , x3 ; cout << "x1= " ; x1.display(); cout << "x2= " ; x2.display(); cout << "x3= " ; x3.display(); cout << "用x3表示x1+x2的结果 : "<<endl; x3=x1.Complex_add(x2) ; cout << "x1+x2= " ; x3.display(); }

 

10、重载输出流运算符

#include <iostream> using namespace std; class Complex{ double real ; double imag ; public : Complex(double r=0,double i=0):real(r),imag(i){} Complex operator+(Complex& c){ return Complex(real+c.real,imag+c.imag) ; } friend ostream& operator<< (ostream& , Complex &c) ; /*流插入运算符的重载函数只能作为友元函数来声明,不可是成员函数。 该重载函数的第一个参数和函数的类型都必须是ostream的引用, 是为了返回cout的当前值并便于连续输出。 */ void display(){ cout << "(" << real << "," << imag << "i)" <<endl; } }; ostream& operator<< (ostream& output , Complex &c){ //output是作为实参cout的形参传入,且共用一个地址。 output << "(" << c.real << "," << c.imag << "i)" <<endl; return output ; } int main(){ Complex c1(1,1) , c2(2,2) , c3 ; cout << "输出已有的两个复数: " << endl; c1.display();c2.display(); cout << "两者相加: " <<endl; c3=c1+c2 ; cout << c3 ; /*cout << c3 << 5 <<endl; 该行中只有第一个流插入运算符是被重载的,后边两个不是Complex类对象而是标准类型的数据 是用预定义的流插入符处理的 */ /*还有一点需要注意:对于本题来说,流插入运算符的重载时作为Complex的友元函数来定义的 那只有在输出Complex类对象时才起到重载的作用 若 Time t ; cout << t ; 这样是不对的,因为t是作为Time的类对象,不能使用用于Complex类的重载运算符 */ }

 

11、复数相加-运算符的重载

#include <iostream> using namespace std; class Complex{ double real; double imag; public: Complex(double r=0,double i=0):real(r),imag(i){} Complex operator+(Complex &c2); void display(){ cout << "("<< real << "," << imag << "i)" <<endl; } }; Complex Complex::operator+(Complex &c2){ Complex c; c.real=real+c2.real ; c.imag=imag+c2.imag; return c ; } int main(){ Complex c , c1(1,1) , c2(2,2) ; c1.display(); c2.display(); c=c1+c2 ; cout << "c1+c2= " ; c.display(); }

 

12、单目运算符的重载-前置或后置++

#include <iostream> using namespace std; class Time{ int hour ; int min ; int sec ; public: Time(int h=0,int m=0,int s=0):hour(h),min(m),sec(s){} Time operator++(){ if(++sec>=60){ sec-=60 ; min++ ; } return *this ; } Time operator++(int){ Time temp(*this); sec++ ; if(sec>=60){ sec-=60 ; min++ ; } return temp ; } void display(){ cout << hour << ":" << min <<":" << sec << endl; } }; int main(){ Time t1(1,1,59) , t2 ; cout << "t1: " ;t1.display(); cout << "t2: " ;t2.display(); ++t1 ; cout << "++t1: ";t1.display(); t2=t1++ ; //t2=++t1 ; cout << "t1++: ";t1.display(); cout << "t2: " ;t2.display(); }

 

最新回复(0)