C++ 在c+中正确使用assert()+;

C++ 在c+中正确使用assert()+;,c++,assert,assertion,invariants,C++,Assert,Assertion,Invariants,我的教授给我们做了一个练习,在这个练习中,我们必须决定何时使用assert(check_inv())来保持对象处于一种关于类不变量的格式良好的状态 我不确定什么时候需要检查类不变量,我知道在从构造函数返回对象之前检查类不变量是一个很好的实践,但是对于其他函数,我不完全确定 这是考试课文: class C { public: bool check_inv() const { // Implementation of cla

我的教授给我们做了一个练习,在这个练习中,我们必须决定何时使用assert(check_inv())来保持对象处于一种关于类不变量的格式良好的状态

我不确定什么时候需要检查类不变量,我知道在从构造函数返回对象之前检查类不变量是一个很好的实践,但是对于其他函数,我不完全确定

这是考试课文:

class C
{ 

    public: 

        bool check_inv() const 
        { 
            // Implementation of class invariant code
        }

        C(int a, int b)
        { 
            // Implementation of class constructor.
        }
        void foo(C& y)
        {
            // Implementation of method foo. 
        }
        void bar(const C& y)
        { 
             // Implementation of method bar.
        }
        void ying(const C& y)
        { 
            // Implementation of method ying. 
        }
        void yang(const C& y) const
         { 
             // Implementation of method yang.
         }
        ~C()
         { 
             // Implementation of class destructor.
         }
        static void zen(int i, double d) 
        { 
            //Implementation of method zen.
        }
// ... Some other code ...
}; // class C
我应该在哪里检查类不变量


编辑:这根本不是一个家庭作业问题,我只需要通过一个例子来理解断言的功能。

可能您应该检查除析构函数之外的所有其他公共类成员函数中的类不变量。您应该检查两次,首先在输入函数之后,然后在退出函数之前,在这两个过程之间,您可以对不变量做一些事情。

考虑对象的生命周期:它由构造函数创建,由
const
成员函数检查,由非
const
成员函数修改,最终由其析构函数销毁。因此,就类不变量而言,它必须在构造函数的末尾和任何非
const
成员函数的末尾得到满足。这足以确保不变量在任何地方都得到满足。在进入函数时检查它不会使类变得健壮;它可能会检测来自外部的覆盖,但这不是类呈现的抽象的一部分。所以:检查每个构造函数末尾和每个非
常量
成员函数末尾的不变量。

我投票将这个问题作为主题外的问题结束,因为这是家庭作业。@Benoit这本身不是结束的原因。如果您想真正安全地执行此操作,您可以在每个函数的开始处以及每次离开可能已修改对象的函数时进行检查。我假定,当您的代码处于释放模式时,您知道没有可能使
断言失败?因为在该阶段,它将被删除,并且无法捕获出现的任何错误状态。不同意。不在ctor末尾检查不变量的原因是什么?它应该在那里实现。这对于dtor可能不是真的,因为它可以在任何时候调用,但那是另一回事。@WernerHenze是的,你是对的。我删除了它。那么dtor的区别是什么呢?如果你对一个对象进行更改,你可能会遇到这样的情况:你从一个有效的不变量开始,然后打破它,然后重新确定它。如果在不变量为非真的时间内发生异常,程序需要终止或删除对象,则会调用dtor。dtor应该处理这个问题。当然,根据对象的不同,您可以确保您的dtor永远不会被称为不变量为非真的对象。@WernerHenze明白了。谢谢。好的,那很有帮助。谢谢!我还应该检查通过参数传递的非常量对象的不变量吗?例如,在方法“foo”中,我应该检查“y”上的不变量吗?最后,我是否也应该以同样的方式对待静态方法?@n_denny-如果你添加断言是因为担心对象会以某种方式损坏,那么就把它们放在任何地方。如果将断言添加为规程以确保对象的成员函数不会损坏对象的状态,那么通过检查通过引用传递的对象可以获得什么(如果有的话),通过检查静态成员函数中的内容可以获得什么(如果有的话)?