Class C++ 中的构造函数

Class constructors in C++

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

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

1.Can 我做了一个这样的构造函数:

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

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

2.How 以后需要的时候再调用吗?我知道默认构造函数是这样调用的:

myClass A;
A = myClass();

一样吗?

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

myClass *B;
B = myClass();

提前致谢! =D

  1. 你的构造函数没问题,只要其中使用的函数是这个或另一个 class.

  2. 的全局函数或静态函数
  3. myClass A;将调用您编写的构造函数。

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

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

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

你可以按照你的建议初始化它(myClass A;

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

  1. 是的,你可以,但这可能不是最好的方法。从输入中读取可能会失败,构造函数中的失败通常是您想要处理的不可恢复的事件。一个好的方法是读取构造函数外部的值,处理错误并仅在 "everything ready" 时调用构造函数。像这样:

    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 行,构造了一个临时对象(再次通过调用默认构造函数),然后使用(C++11 的 rval)复制运算符将其分配给 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());
    

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