C ++中的类构造函数

时间:2015-06-06 16:47:33

标签: c++ constructor

我是c ++的初学者,所以我脑子里有很多不太清楚的东西。

我有这个代码我需要编写,在类中我创建一个构造函数。 但是,我不需要任何参数,因为我从构造函数中的文件流中读取。所以我的问题是:

1.我可以制作一个这样的构造函数:

class myClass {
private:
  string title;
  string organizer;
public:
  myClass() {
    title = stringRead();
    organizer = stringRead();
  }
}

其中stringRead()是我写的从我的文件中读取的函数??

2.如果需要,我怎么称呼它?我知道默认的构造函数是这样调用的:

myClass A;
A = myClass();

是否一样?

3.如果我有指针,我该如何再次调用构造函数?这似乎不应该是正确的......

myClass *B;
B = myClass();

提前致谢! = d

4 个答案:

答案 0 :(得分:2)

1)这个构造函数可以工作但你应该赞成使用初始化列表(假设stringRead()不是myClass的成员函数

class myClass {
private:
  string title;
  string organizer;
public:
  myClass() 
    : title(stringRead()),
      organizer(stringRead())
  { }
};

2)myClass A;是你应该做的。你可以选择auto A = myClass();,在优化之后,它们将是同一个东西。在没有优化的情况下,将构造一个临时的,然后A将从它构造移动,因此不能使用不可移动的对象(您的对象是可移动的)

3)如果你想使用原始指针,那么你将使用

myClass *ptr = new myClass;
// bunch of code
delete ptr;

但是,您最好使用智能指针来控制其生命周期。这样您就不需要手动删除

std::unique_ptr<myClass> ptr(new myClass);
c ++ 14中的

或make_unique

auto ptr = std::make_unique<myClass>();

如果您拥有共享所有权

,当然可以使用shared_ptr

答案 1 :(得分:1)

  1. 你的构造函数很好,只要它中使用的函数是这个或另一个类的全局或静态函数。

  2. myClass A;将调用您编写的构造函数。

  3. 要使用指针,您需要B = new myClass()。那也将调用相同的构造函数。不要忘记在某些时候删除B,否则你会泄漏内存。

  4. 请记住,如果在构造函数中抛出异常,则不会调用析构函数。

答案 2 :(得分:1)

我认为将函数返回的值赋给类的成员是可以的。

您可以按照建议(使用myClass A;

对其进行初始化

使用指针时,需要myClass *k=new myClass();。您应该记得删除使用delete k;创建的对象。

答案 3 :(得分:1)

  1. 是的,你可以,但它可能不是最好的方法。从输入读取可能会失败,构造函数中的失败通常是您要处理的不可恢复的事件。一种好的方法是读取结构体外部的值,处理错误并仅在“准备就绪”时调用构造函数。像这样:

    class myClass {
    private:
    string _title;
    string _organizer;
    public:
      myClass(const string &title, const string &organizer) {
        _title = title;
        _organizer = organizer;
    }
    

    或者,通过使用更惯用的C ++初始化列表:

    class myClass {
    private:
    string _title;
    string _organizer;
    public:
      myClass(const string &title, const string &organizer):
        _title(title), _organizer(organizer) {}
    }
    

    然后,在其他地方:

    string title = stringRead();
    string organizer = stringRead();
    myClass A(title, organizer);
    
  2. 不,在此代码段中:

    myClass A;
    A = myClass();
    

    发生了两件不同的事情:在第1行调用默认构造函数;在第2行,构造一个临时对象(再次,通过调用默认构造函数),然后使用(rval for C ++ 11)复制操作符分配给A。这个表达式:

    myClass A;
    

    调用默认构造函数。如果你有参数:

    myClass A(title, organizer);
    
  3. 不,这甚至不起作用。指针不是对象,您必须分配对象。此时,您可以获得指向它的指针:

    myClass A;
    myClass *B = &A;
    

    你也可以求助于动态分配:

    myClass *B = new myClass;
    

    在这种情况下,要记得在其他地方调用delete B或在智能指针中包装B

    std::unique_ptr<myClass> B(new myClass());