所以我在IDE CodeBlocks 13.12中创建了一个带有两个私有指针,两个setter,两个getter,一个构造函数和一个析构函数的简单类.对于普通变量,getter返回精确值,但使用指针返回一个奇怪的值,另一个返回精确值.
这是我班级的标题:
#ifndef COMPLEXE_H_INCLUDED #define COMPLEXE_H_INCLUDED #includeclass Complexe{ public: Complexe(const double re = 0.0, const double im = 0.0); ~Complexe(); double getReel() const; double getImag() const; void setReel(double); void setImag(double); private: double* re; double* im; }; #endif // COMPLEXE_H_INCLUDED
这是我班级的来源
#include "complexe.h" Complexe::Complexe(const double re, const double im) { double a = re; double b = im; this->re = &a; this->im = &b; } Complexe::~Complexe() { delete re; delete im; } double Complexe::getReel() const { return *re; } double Complexe::getImag() const { return *im; } void Complexe::setReel(double a) { *this->re = a; } void Complexe::setImag(double a) { *this->im = a; }
这是我的主要功能
int main() { Complexe cpl1(12, 3); cout << "C1 | " << "Re : " << cpl1.getReel() << ", Im : " << cpl1.getImag() << endl; cpl1.setReel(50); cpl1.setImag(50); cout << "C1 | " << "Re : " << cpl1.getReel() << ", Im : " << cpl1.getImag() << endl; Complexe * cpl2 = new Complexe(20,20); cout << "C2 | " << "Re : " << cpl2->getReel() << ", Im : " << cpl2->getImag() << endl; return 0; }
最后,这是我得到的值:
结果
我的代码和对指针的理解有什么问题?谢谢
PS:奇怪的是,当我将构造函数代码更改为:
Complexe::Complexe(const double re, const double im) { double a = re; double b = im; this->re = &a; this->im = &a; // &a here too // or &b in both }
我得到了确切的值:
结果与参考相同
a
并且b
在构造函数中是自动变量,因此在构造函数返回时会被销毁.
任何进一步访问re
或im
将导致未定义的行为.
既a
没有b
也没有在免费商店上分配,即使用new
,所以delete
没有意义,并且是未定义的行为.只需将析构函数留空; 对象将自动销毁而不会泄漏.
你正在经历的"好奇心"只是巧合; 未定义的行为是未定义的,因此它可能非常有效.
笔记:
正如@LightnessRacesinOrbit在您的问题的评论中所述,您可以使用不需要它们的指针.只需将参数复制到成员函数就足够了,肯定会使代码看起来更干净.当然,它可以工作,但这样的指针使用并不会影响性能,只是......是的,毫无意义.