1.定义一个矩形类,有长,宽两个属性,有成员函数计算矩形的面积。

在该矩形类中,我做了5个主要的测试。

  1. 构造函数带默认值参数,利用默认值参数计算矩形面积:rectangle(double x=2.0,double y=4.0);    cout<<r.calarea(r.getx(),r.gety())<<endl;  
  2. 测试复制构造函数什么时候被调用:
    1. 用类的一个对象去初始化另一个对象的时候被调用
    2. 如果参数的形参是类的对象,调用函数时,形参和实参相结合时被调用
    3. 函数的返回值是类的对象时被调用。
  3. 查看对象的成员地址,查看对象的地址。
     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     } 
    rectangle

相关文章: