[英]Cannot figure out how to calculate radius of the circle in the given code
我需要在代码中计算圆的半径。
#include <iostream>
#include <cmath>
using namespace std;
class Circle {
float radius;
const float PI=3.14;
public:
Circle(float radius){
}
Circle getRadius()
{
return radius;
}
Circle setRadius(float radius)
{
this->radius = radius / PI;
return radius;
}
float Area()
{
return radius*radius*PI;
}
float Perimeter()
{
return 2*radius*PI;
}
int equal()
{
return Area()==Perimeter();
}
};
int main() {
float r;
cin >> r;
Circle c(r);
cout << c.Perimeter() << endl;
cout << c.Area() << endl;
cout << c.equal() <<endl;
return 0;
}
我尝试使用指针,但我无法弄清楚。
在
Circle(float radius){
}
与成员变量同名的参数不是该成员变量。 相反,它隐藏了成员变量,有效地替换了它,除非你知道去哪里找。 将值传递给名为radius
的参数不会更改名为radius
的成员变量的值,这会使成员radius
保持未初始化状态。
这意味着
float Perimeter()
{
return 2*radius*PI;
}
和其他函数,不包括setRadius
,对未初始化的变量进行操作,结果将是未定义的。
一种可能的解决方案是确保将成员radius
初始化为参数radius
的值。
你不能简单地
Circle(float radius){
radius = radius;
}
因为只有一个radius
,该成员已经被遮蔽,所以参数radius
将其值赋给自己。 这是合法的代码,所以它可以编译,但编译器通常会发出警告。
而是使用
Circle(float radius) : radius(radius) {
}
这利用了Member Initializer List ,它是 C++ 编程语言最重要(而且似乎是教得最少的)功能之一。 它允许您安全地重复使用术语radius
,因为第一个radius
必须是成员radius
。
你也可以
Circle(float radius) {
this->radius = radius;
}
显式使用成员radius
,但对于更复杂的成员,这种方法可能效率低下。 所有的成员变量和基类都在进入构造函数体之前被初始化。 之后你能做的最好的就是分配。 这意味着成员将被默认初始化(如果存在默认构造函数;如果不存在,则必须使用成员初始化列表),然后必须构造一个临时变量,然后将这个临时变量分配给成员。 可能有很多额外的工作没有任何好处。
边注:
注意this->radius = radius / PI;
在setRadius
中。 这是不寻常的,可能是一个错误。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.