老师,您好,我刚刚学完咱们这个课程的基础部分,我写了一个这样的小程序,
目的是为了对一个vector求均值时,避免重复计算,程序如下:
#include <vector>
#include <iostream>
class Q {
public:
Q(): sum_(nullptr), mean_(nullptr) {}
void Append(double &i) {
data_.push_back(i);
}
double Sum() {
if (sum_ == nullptr) {
std::cout << "求和..." << std::endl;
double temp = 0;
for (auto it=data_.begin(); it!=data_.end(); it++) {
temp += (*it);
}
sum_ = new double(temp);
}
return *sum_;
}
double Mean() {
if (mean_ == nullptr) {
std::cout << "求均值..." << std::endl;
mean_ = new double(Sum() / data_.size());
}
return *mean_;
}
void Clean() {
if (sum_ != nullptr) {
delete sum_;
sum_ = nullptr;
}
if (mean_ != nullptr) {
delete mean_;
mean_ = nullptr;
}
}
~Q() {
Clean();
}
private:
std::vector<double> data_;
double *sum_;
double *mean_;
};
int main() {
Q q;
double d1 = 1.0;
double d2 = 2.0;
double d3 = 3.0;
double d4 = 4.0;
q.Append(d1);
q.Append(d2);
q.Append(d3);
q.Append(d4);
std::cout << q.Mean() << std::endl;
std::cout << q.Mean() << std::endl;
}
我有这样几个问题:
对于Sum方法
和Mean
方法,由于方法内部计算出来的结果,需要在函数外部用到,是否必须使用new
在堆区进行创建?
例如:
class A1 {
public:
A1() {
i = 1;
j = 2;
}
private:
int i;
int j;
}
class A2 {
public:
A2() {
i = new int(1);
j = new int(2);
}
~A2() {
delete i;
i = nullptr;
delete j;
j = nullptr;
}
private:
int *i;
int *j;
}
A1因为没有堆区的变量,不写析构方法不会造成内存泄漏,而A2则必须写。
Append方法
由于参数是一个引用,直接这样调用不行:
q.Append(5.0);
而必须这样:
double d5 = 5.0;
q.Append(d5);
有没有什么好方法能够避免临时变量d5?