2015-12-31 228 views
1

我一直在试图理解默认构造函数,我想我得到它,如果它是类中唯一的构造函数。但是如果我在类中定义了多个构造函数呢?我想要做的是创建一个类“向量”,它将存储二维向量。我需要一个构造函数来将坐标设置为主函数中给出的值。我还需要一个默认的构造函数,调用时,将坐标设置为0。我似乎无法弄清楚如何使双方工作,在相同的代码默认构造函数与正常构造函数的类C++

#include <iostream> 
#include <string> 
#include <cmath> 
#include <vector> 
#include <algorithm> 

using namespace std; 

class Vector { 
    double x_coord, y_coord; 
public: 
Vector(double x_coord=0, double y_coord=0); //default contructor??? 

Vector (double x, double y) //normal constructor 
{ 
    set_values (x,y); 
} 
void set_values(double new_x, double new_y) //function to set values for the vectors 
    { 
     x_coord=new_x; 
     y_coord=new_y; 
    } 
    double get_x() 
    { 
     return x_coord; 
    } 
    double get_y() 
    { 
     return y_coord; 
    } 

}; 
+0

要么有一个构造函数'Vector(double x_coord = 0,double y_coord = 0);'它既可以作为默认构造函数使用,因为它可以不带参数调用,也可以作为双参数构造函数使用;或者两个构造函数,一个不带参数,如'Vector()',另一个带两个'Vector(double x,double y)'。拥有一个总是带有两个参数的构造函数,以及可选地使用相同参数的构造函数是没有意义的。 –

回答

1

默认构造函数构造函数调用时在定义class的实例时,您省略了这些缺陷。示例:

Vector vec; 

在此,执行默认构造函数(Vector::Vector(double = 0, double = 0))。

您可以删除其他构造(Vector::Vector(double, double)),并使用这个定义的默认构造函数:

Vector(double x_coord = 0, double y_coord = 0) { 
    set_values(x_coord, y_coord); 
} 

当你传递两个参数,这将被自动调用。此外,模糊性已解决:如果通过这两个构造函数,你通过了两个double?应该叫他们哪一个?编译器会提出一个错误,说构造函数是不明确的。


注:

  • set_values功能似乎没有用处,因为它没有做任何有用的工作。在构造函数中使用成员初始值设定项列表来提高性能。此外,它被认为是良好的作风:

    Vector(double x_coord = 0, double y_coord = 0): x_coord(x_coord), y_coord(y_coord) { } 
    
  • 你大量使用getter和setter方法看起来...坏。它打破封装。提供函数,这些函数不公开实现细节,但执行有用的操作,如move

2

我能想象使用下面的构造类的对象:

Vector v1;   // Construct with x = 0, y = 0 
Vector v2(10);  // Construct with x = 10, y = 0 
Vector v3(10, 20); // Construct with x = 10, y = 20 

可以完成这一切只用一个构造函数:

Vector(double x=0, double y=0) : x_coord(x), y_coord(y) {} 

你不需要第二个构造函数。

+0

非常感谢,这似乎是一个非常干净的做法 –

1

没关系,我想到了一切。 如果有人需要的答案: 你可以有你定义默认构造函数的默认和类

class Vector { 
double x_coord, y_coord; 
public: 
Vector(): x_coord(0), y_coord(0) {}; //default constructor 

Vector (double x, double y) //normal constructor 
{ 
    set_values (x,y); 
} 

它只是方式定义其他构造。

+0

只用一个构造函数就可行。看看答案! – Downvoter