小编Mem*_*ter的帖子

在构造函数中使用setter

我是一名试图学习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)

c++ setter constructor

5
推荐指数
1
解决办法
2273
查看次数

取消引用引用

我正在阅读"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++ pointers reference dereference

3
推荐指数
1
解决办法
5077
查看次数

在对象构造中使用"="的效果

另一个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)

这是为什么?

c++ constructor initialization initializer-list c++11

2
推荐指数
1
解决办法
113
查看次数