价值不会改变

时间:2017-04-27 12:36:58

标签: c++

// Example program
#include <iostream>
#include <string>
using namespace std;

class circle {

    private:
    double r;
    double const pi=3.14;

    public:

    circle(double rad){

        r=rad;

        }

    void periArea(){
        double p,s;

        p=2*pi*r;
        s=pi*pi*r;
        cout<<"\nS= "<<s<<endl;
        cout<<"\nP= "<<p<<endl;
        }

        friend void changeRad(circle circle, double newrad);
    };

    void changeRad(circle circle, double newrad){

        circle.r=newrad;

        }

int main()
{
    double inpr,newr;
    cout<<"input radius: ";
    cin>>inpr;
    circle c1(inpr);
    c1.periArea();
    cout<<"\ninput new radius: ";
    cin>>newr;
    changeRad(c1,newr);
    c1.periArea();
}

我有这个cpp代码,必须定义一个计算周长和面积的类圆,然后使用友元函数改变半径并再次计算面积和周长。但是,即使在更改函数之后,我也得到相同的p和s值。

2 个答案:

答案 0 :(得分:6)

粗略地说,您需要更改功能以通过引用传递

void changeRad(circle& circle, double newrad){

(注意使用&)。否则,circle实例的副本将传递给该函数,对该副本的任何更改都不会反映在原始文件中。

但是正常的做事方式是安排你的代码以便你使用

c1.changeRad(newr);

在通话现场。

此外,使用double将pi存储到3位有效数字非常糟糕。我最喜欢的方法是使用

const double PI = std::atan(1.0) * 4;

因为C ++标准为你定义pi(M_PI是POSIX,而不是ISO!)。

答案 1 :(得分:1)

您必须传递一个对象类型Circle by reference

<Directory /var/www/>
    Options Indexes FollowSymLinks
    AllowOverride all
    Require all granted
</Directory>

考虑到虽然当名称与类型名称一致时它是参数的有效声明,但这可能会使读者感到困惑,参数名称会隐藏类型的名称。因此,最好重命名参数的名称,例如

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ index.php [NC,L]

最好使该函数成为该类的非静态成员。例如

friend void changeRad( circle &circle, double newrad);
                             ^^^