学习日志(二十)
面向对象练习的错题&&友元函数
KiKi理解了继承可以让代码重用,他现在定义一个基类shape,私有数据为坐标点x,y, 由它派生Rectangle类和Circle类,它们都有成员函数GetArea()求面积。派生类Rectangle类有数据:矩形的长和宽;派生类Circle类有数据:圆的半径。Rectangle类又派生正方形Square类,定义各类并测试。输入三组数据,分别是矩形的长和宽、圆的半径、正方形的边长,输出三组数据,分别是矩形、圆、正方形的面积。圆周率按3.14计算。
输入描述:
输入三行,
第一行为矩形的长和宽,
第二行为圆的半径,
第三行为正方形的边长。
输出描述:
三行,分别是矩形、圆、正方形的面积。
#include <iostream>
using namespace std;
class Shape{
private:
double x;
double y;
public:
Shape(double x1=0,double y1=0) : x(x1),y(y1) {}
};
class Rectangle:public Shape {
protected:
double length;
double width;
public:
Rectangle(double x1=0,double y1=0,double l=0,double w=0):Shape(x1,y1),length(l),width(w) {}
double Getarea() {return length*width;}
};
class Circle : public Shape {
protected:
double radius;
public:
Circle(double x1=0,double y1=0,double r=0):Shape(x1,y1),radius(r){}
double Getarea() {return 3.14*radius*radius;}
};
class Square:public Rectangle {
protected:
double bianchang;
public:
Square(double side) : Rectangle(side, side) {}
void set(double a){
bianchang=a; 一定不要写成a=bianchang
}
double Getarea() {return bianchang*bianchang;}
};
int main() {
double l,w;
std::cin>>l>>w;
Rectangle rect(0,0,l,w);
double r;
std::cin>>r;
Circle circle(0,0,r);
double side;
std::cin>>side;
Square square(side);
square .set(side); side的值确定后,a的值确定,从而确定bianchang ;注意加.
std::cout<<rect.Getarea()<<std::endl;
std::cout<<circle.Getarea()<<std::endl;
std::cout<<square.Getarea()<<std::endl;
return 0;
} 注意所有数据类型 double
友元函数
C++中,友元是一种特殊的机制,它可以一个类或函数访问另一个类的私有成员。这在一定程度上打破了封装性,但有时候为了实现某些功能,友元是必要的。
友元函数是可以直接访问类的私有成员的非成员函数。它是定义在类外的普通函数,它不属于任何类,但需要在类的定义中加以声明,声明时只需在友元的名称前加上关键字 friend。
例:#include<iostream>
using namespace std;
//先定义一个类
class MyClass
{
private:
int age;
public:
//用来改变age
void setage(int i);
//友元函数,参数是MyClass对象
friend void myFun(MyClass obj);
};
//成员函数,要加::
void MyClass::setage(int i)
}
age=i;
//正常的普通函数而已
}
void myFun(MyClass obj)
{
cout<<obj.age<<endl;
obj.age=998;
cout<<obj.age<<endl;
}
int main()
{
MyClass f1;
myFun(f1);
f1.setage(1000);
return 0;
}