繁体   English   中英

C ++中的类构造函数

[英]Class constructors in C++

我是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

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. 只要构造函数中使用的函数是此类或另一个类的全局变量或静态函数,就可以使用构造函数。

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

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

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

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

您可以按照建议进行初始化(使用myClass A;

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

  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行,构造了一个临时对象(同样,通过调用默认构造函数),然后使用(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()); 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM