我是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
答案 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)
你的构造函数很好,只要它中使用的函数是这个或另一个类的全局或静态函数。
myClass A;将调用您编写的构造函数。
要使用指针,您需要B = new myClass()。那也将调用相同的构造函数。不要忘记在某些时候删除B,否则你会泄漏内存。
请记住,如果在构造函数中抛出异常,则不会调用析构函数。
答案 2 :(得分:1)
我认为将函数返回的值赋给类的成员是可以的。
您可以按照建议(使用myClass A;
)
使用指针时,需要myClass *k=new myClass();
。您应该记得删除使用delete k;
创建的对象。
答案 3 :(得分: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);
不,在此代码段中:
myClass A;
A = myClass();
发生了两件不同的事情:在第1行调用默认构造函数;在第2行,构造一个临时对象(再次,通过调用默认构造函数),然后使用(rval for C ++ 11)复制操作符分配给A
。这个表达式:
myClass A;
调用默认构造函数。如果你有参数:
myClass A(title, organizer);
不,这甚至不起作用。指针不是对象,您必须分配对象。此时,您可以获得指向它的指针:
myClass A;
myClass *B = &A;
你也可以求助于动态分配:
myClass *B = new myClass;
在这种情况下,要记得在其他地方调用delete B
或在智能指针中包装B
:
std::unique_ptr<myClass> B(new myClass());