1.定义一个矩形类,有长,宽两个属性,有成员函数计算矩形的面积。
在该矩形类中,我做了5个主要的测试。
- 构造函数带默认值参数,利用默认值参数计算矩形面积:rectangle(double x=2.0,double y=4.0); cout<<r.calarea(r.getx(),r.gety())<<endl;
- 测试复制构造函数什么时候被调用:
- 用类的一个对象去初始化另一个对象的时候被调用
- 如果参数的形参是类的对象,调用函数时,形参和实参相结合时被调用
- 函数的返回值是类的对象时被调用。
- 查看对象的成员地址,查看对象的地址。
rectangle
1 #include<iostream> 2 using namespace std; 3 class rectangle{ 4 public: 5 rectangle(double x=2.0,double y=4.0); 6 rectangle(rectangle &r);//复制构造函数:类名+&对象名 7 ~rectangle(); 8 double calarea(double a,double b); 9 double getx(){ 10 return x; 11 } 12 double gety(){ 13 return y; 14 } 15 double * ptr_x()//查看地址 16 { 17 double *x_ptr = &y; 18 return x_ptr; 19 } 20 private: 21 double x; 22 double y; 23 }; 24 25 double rectangle::calarea(double a,double b){ 26 x=a; 27 y=b; 28 return a*b; 29 } 30 rectangle::rectangle(double a,double b){ 31 x=a; 32 y=b; //在声明处定义之后,在此处如果没有将值赋给x,y,那么x,y将不会有初值,使用getx()得到的将是一个默认分配的地址 33 34 } 35 rectangle::rectangle(rectangle &r){ 36 x=r.x; 37 y=r.y; 38 cout<<"复制构造被调用"<<endl; 39 } 40 rectangle::~rectangle(){ 41 42 } 43 //测试复制函数被调用的第二种情况 44 void f(rectangle r){ 45 cout<<"值传递的情况"<<endl; 46 } 47 void f2(rectangle &r){ 48 cout<<"引用传递的情况"<<endl; 49 } 50 //测试复制函数被调用的第三种情况 51 rectangle g(){ 52 rectangle a(8,9); 53 return a; 54 } 55 int main(){ 56 rectangle r,r2(5,6),r4; 57 58 cout<<"默认参数求面积:"<<r.calarea(r.getx(),r.gety())<<endl;//如果嵌套调用会出错; ques:类的私有成员能不能当做形参; 59 cout<<"初始化后求面积:"<<r.calarea(4,5)<<endl; 60 61 cout<<r2.calarea(5,6)<<endl; 62 rectangle r3(r2);//用类的一个对象去初始化另一个对象可以调用复制构造函数 63 cout<<"利用对象初始化对象求面积:"<<r3.calarea(r2.getx(),r2.gety())<<endl; 64 //r4(&r2);//qus:想利用引用传递?对象利用对象初始化不能使用引用传值? 65 66 67 f(r2); //对象做形参,值传递会调用复制构造 68 f2(r2); //地址传递不会调用复制构造 69 //??为什么值传递和地址传递在调用复制构造函数会0有差别? 70 71 72 cout<<"r4地址:"<<r4.ptr_x()<<endl; 73 r4=g();//测试有没有调用复制构造函数; 74 cout<<r4.getx()<<endl; 75 //想查看对象地址,怎么办 76 cout<<"r4返回调用后的地址:"<<r4.ptr_x()<<endl; 77 return 0; 78 79 }