我是一名试图学习C++的Java开发人员.是否可以在构造函数中使用setter以重用setter提供的健全性检查?
例如:
#include <stdexcept>
using namespace std;
class Test {
private:
int foo;
void setFoo(int foo) {
if (foo < 42) {
throw invalid_argument{"Foo < 42."};
}
this->foo = foo;
}
public:
Test(int foo) {
setFoo(foo);
};
};
Run Code Online (Sandbox Code Playgroud) 我正在阅读"The C++ Programming Language(第4版)",我遇到了这个:
template<class C, class Oper>
void for_all(C& c, Oper op) // assume that C is a container of pointers
{
for (auto& x : c)
op(*x); // pass op() a reference to each element pointed to
}
Run Code Online (Sandbox Code Playgroud)
所以从我的理解,我们正在迭代c并获得一个引用x,这是当前的迭代.x然后传递给函数调用运算符op,但它首先被解除引用?为什么会x被解除引用?
另一个C++问题,我试图弄清楚在构造对象时使用"="会产生什么影响.考虑:
class Foo {
private:
int bar;
int baz;
public:
Foo(int bar, int baz)
:bar(bar), baz(baz) {}
};
int main() {
Foo foo1{4, 2};
Foo foo2 = {4, 2};
Foo foo3 = Foo{4, 2}; // I prefer this one for aesthetic reasons.
return 0;
}
Run Code Online (Sandbox Code Playgroud)
有什么区别,我应该坚持哪种最佳做法?
此外,虽然我们讨论的是最佳实践的主题,但我听说添加explicit构造函数是一个好主意™因为隐式转换的奇怪行为.所以我添加explicit到构造函数Foo:
public:
explicit Foo(int bar, int baz)
:bar(bar), baz(baz) {}
Run Code Online (Sandbox Code Playgroud)
突然,这个:
Foo foo2 = {4, 2};
Run Code Online (Sandbox Code Playgroud)
无法编译错误:
error: chosen constructor is explicit in copy-initialization
Run Code Online (Sandbox Code Playgroud)
这是为什么?