【问题标题】:How can I build a proper constructor and destructor?如何构建正确的构造函数和析构函数?
【发布时间】:2016-11-04 05:37:08
【问题描述】:

问题#1:我如何构建一个构造函数来设置(R,PoF,PoR) 的值?我想了解构造函数的工作原理,但我想我不太明白。

问题 #2:我可以用这种方式构建析构函数,而不是我在程序中使用的方式吗?

Circle::~Circle()
{
    std::cout << "The fence would cost " << SwimmingPool.PerimeterP(r) << std::endl;
    std::cout << "The road would cost " << SwimmingPool.AreaP(r) << std::endl;
    std::cout << "Present by FF" << std::endl;
}

我只想让成本自己出来,但我不知道我应该如何创建析构函数来做到这一点。

这是我的完整代码:

#include "stdafx.h"
#include "iostream"


const double PI = 3.1415926;

class Circle
{
public:
    Circle();
    double AreaP(int r);
    double PerimeterP(int r);
    ~Circle();


private:
    int R;
    int PoF;
    int PoR;
};

double Circle::AreaP(int r)
{
    return ((r + R)*(r + R) - r*r)*PI*PoR;
}

double Circle::PerimeterP(int r)
{
    return (r + R) * 2 * PI*PoF;
}

Circle::Circle()
{
    int R = 3;
    int PoF = 35;
    int PoR = 20;
}

Circle::~Circle()
{
    std::cout << "Present by FF" << std::endl;
}

int main()
{
    int r;
    Circle SwimmingPool;
    std::cout << "Please input the radius of the Swimming Pool." << std::endl;
    std::cin >> r;
    std::cout << "The fence would cost " << SwimmingPool.PerimeterP(r) << std::endl;
    std::cout << "The road would cost " << SwimmingPool.AreaP(r) << std::endl;
    return 0;
}

【问题讨论】:

  • 如果你们能解释一下如何构建这两个东西就好了。我很困惑。我不知道如何解释我的问题,但我就是无法彻底思考这两件事......
  • 我不知道 PoF 和 PoR 代表什么。
  • 该程序旨在解决一个现实世界的程序。 PoF 代表围栏价格,PoR 代表道路价格。

标签: c++ constructor destructor


【解决方案1】:

你有:

Circle::Circle()
{
    int R = 3;
    int PoF = 35;
    int PoR = 20;
}

该函数创建三个函数局部变量并设置它们的值。它不初始化类的成员。将其更改为:

Circle::Circle() : R(30), PoF(35), PoR(20) {}

总是喜欢在初始化列表中进行初始化,而不是在构造函数的主体中设置值。


不,你不能使用:

Circle::~Circle()
{
    std::cout << "The fence would cost " << SwimmingPool.PerimeterP(r) << std::endl;
    std::cout << "The road would cost " << SwimmingPool.AreaP(r) << std::endl;
    std::cout << "Present by FF" << std::endl;
}

SwimmingPoolmain 中的一个变量。它不能在析构函数中使用。此外,在析构函数中打印这些消息是没有意义的。应该是

Circle::~Circle()
{
}

【讨论】:

  • 你能解释一下设置变量值和初始化类成员的区别吗?能否解释一下 Circle::Circle() 中 {} 的作用:R(30), PoF(35), PoR(20) {} 谢谢。
  • 如果您不使用初始化语法初始化成员变量,如果类型是 POD 类型,它们将保持未初始化状态。如果类型是类,则调用其默认构造函数。如果对象类型是 POD 类型,那么在初始化列表中不初始化它们很容易出错。如果您在构造函数初始化之前最终在构造函数中使用了其中一个变量,则您的程序具有未定义的行为。
  • {} 是构造函数的空体。
【解决方案2】:
Circle::Circle() : R(3), PoF(3), PoR(3) {};

将 R、PoF、PoR 定义为 const int

析构函数不能抛出异常,通常你希望它释放对象获取的资源。通常不是将内容输出到标准输出的最佳位置。

除非你想刷新流,否则不要使用std::endl。请改用'\n'

【讨论】:

  • 您能解释一下“刷新流”是什么意思吗?我是新手,所以……看不懂……
  • @RunshengMa - 存储在流中的所有数据都被传递到端点(例如屏幕)并从流的缓冲区中删除。将数据块写入端点并使用缓冲通常更有效。
猜你喜欢
  • 2013-07-07
  • 2011-04-03
  • 2010-12-16
  • 2021-07-28
  • 1970-01-01
  • 2011-12-27
  • 1970-01-01
  • 1970-01-01
  • 2016-09-09
相关资源
最近更新 更多