[英]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.