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
你的构造函数没问题,只要其中使用的函数是这个或另一个 class.
的全局函数或静态函数
myClass A;将调用您编写的构造函数。
要使用指针,您需要 B = new myClass()。这也将调用相同的构造函数。不要忘记在某些时候删除 B 否则你会泄漏内存。
请记住,如果在构造函数中抛出异常,则不会调用析构函数。
我认为将函数返回的值赋给class的成员是可以的。
你可以按照你的建议初始化它(myClass A;
)
当你使用指针时,你需要myClass *k=new myClass();
。您应该记得删除您使用 delete k;
创建的对象。
是的,你可以,但这可能不是最好的方法。从输入中读取可能会失败,构造函数中的失败通常是您想要处理的不可恢复的事件。一个好的方法是读取构造函数外部的值,处理错误并仅在 "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);
不,在这个片段中:
myClass A;
A = myClass();
发生了两件不同的事情:在第 1 行调用了默认构造函数;在第 2 行,构造了一个临时对象(再次通过调用默认构造函数),然后使用(C++11 的 rval)复制运算符将其分配给 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());
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
我是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
你的构造函数没问题,只要其中使用的函数是这个或另一个 class.
的全局函数或静态函数
myClass A;将调用您编写的构造函数。
要使用指针,您需要 B = new myClass()。这也将调用相同的构造函数。不要忘记在某些时候删除 B 否则你会泄漏内存。
请记住,如果在构造函数中抛出异常,则不会调用析构函数。
我认为将函数返回的值赋给class的成员是可以的。
你可以按照你的建议初始化它(myClass A;
)
当你使用指针时,你需要myClass *k=new myClass();
。您应该记得删除您使用 delete k;
创建的对象。
是的,你可以,但这可能不是最好的方法。从输入中读取可能会失败,构造函数中的失败通常是您想要处理的不可恢复的事件。一个好的方法是读取构造函数外部的值,处理错误并仅在 "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);
不,在这个片段中:
myClass A; A = myClass();
发生了两件不同的事情:在第 1 行调用了默认构造函数;在第 2 行,构造了一个临时对象(再次通过调用默认构造函数),然后使用(C++11 的 rval)复制运算符将其分配给
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());
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