【问题标题】:Why aren't my values being initialized by my initialization (parameterized) constructors?为什么我的值没有被我的初始化(参数化)构造函数初始化?
【发布时间】:2019-06-11 03:25:53
【问题描述】:

我有一个基类Point,其中有3 个变量我想派生为Body 属性。我想初始化一个点并用它来初始化一个body对象。这是我目前所拥有的:

#include <iostream>
using namespace std;

class Point {
    public:
        double x, y, z;

        // default constructor
        Point(): x(0), y(0), z(0){
        };
        // intialization constructor
        Point(double x, double y, double z){
            x = x;
            y = y;
            z = z;
        }
        // copy constructor
        Point(const Point &point){
            x = point.x;
            y = point.y;
            z = point.z;
        }

        void print_point(){
            cout << "x = "<< x << " y = " << y << " z = " << z << endl;
        }
};

class Body: public Point{
    public:
        double mass;

        // default constructor
        Body(): Point(0, 0, 0), mass(0){
        };
        // intialization constructor
        Body(const Point& point, double mass): Point(point.x, point.y, point.z){
            mass = mass;
        }
        // copy constructor
        Body(const Body &body): Point(body){
            mass = body.mass;
        }

        void print_body(){
            cout << "x = "<< x << " y = " << y << " z = " << z << " mass = " << mass << endl;
        }
};


int main() {

    Point p(1., 2., 3.);
    p.print_point();

    Body b(p, 65.);
    b.print_body();

    return 0;
}

当我编译并运行它时,我得到:

x = 0 y = 0 z = 6.95312e-310
x = 2.25081e-314 y = 0 z = 0 mass = 0

当我期望得到:

x = 1 y = 2 z = 3
x = 1 y = 2 z = 3 mass = 65

好像变量被默认构造函数重置了,我不知道是什么原因造成的。

【问题讨论】:

  • mass = mass 必须是 this-&gt;mass = mass
  • 你认为x=x 做了什么,为什么? 始终使用成员初始化语法。永远不要在构造函数的主体中分配成员。让它自动化。写一个构造函数? 立即键入冒号。

标签: c++ parameters constructor initialization


【解决方案1】:

你应该改变构造函数体内的赋值

x = x;
y = y;
z = z;

this->x = x;
this->y = y;
this->z = z;

在构造函数的主体中,参数的名称​​隐藏数据成员的名称。例如x = x; 只是将参数x 分配给自己,不分配数据成员xBody 类也有同样的问题。

更好的方法是用member initializer list 初始化数据成员,(顺便说一句,它没有这样的名称隐藏问题)。例如

Point(double x, double y, double z) : x(x), y(y), z(z) {}

【讨论】:

  • 而且私有数据成员最好采用通用的后缀或前缀(如x_y_z_)。
  • @NikosC。就像Point(double x_, double y_, double z_) : x(x_), y(y_), z(z_) {}?
  • @scrollout 不,反之亦然。私有成员应该有_ 后缀。这是具有类的语言的常见做法。有些人使用_ 后缀,有些人使用字母前缀(如m_xm_ym_z)。它有助于避免编写this-&gt;,并且还清楚地表明该对象是私有数据成员,而无需查找类定义。当然,这些成员在这里是公开的,但我认为这只是在您的示例代码中。它们应该是私有的并具有公共的 getter 函数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-29
  • 2021-12-16
  • 1970-01-01
相关资源
最近更新 更多