三法则(Rule of Three)在C++里,它是一个以设计的基本原则而制定的定律。它的要求是,假如类有明显定义下列其中一个成员函数,那么程序员必须写入其他两个成员函数到类内,也就是说下列三个成员函数缺一不可:析构函数、复制构造函数、赋值运算符。上述三个函数是特别的成员函数,假如程序员没有自行定义或宣告这三个函数,编译器会自动地创建他们并且编译到应用程序内。然而,如果程序员仅定义其中一个,其余两个函数仍然会由编译器自动产生,这种混杂的情况非常容易产生程序员难以预期的错误。三法则的存在,正是提醒程序员避免那样的陷阱。三法则这个专有名词是由马歇尔·克来恩于1991年创立的,假设类有用到RAII,可以不必定义析构函数。 因为隐式生成的构造函数与赋值运算符可以很容易地复制类内所有的数据成员,当数据成员是指针类型时,指针地址会随着类而跟着被复制。要注意的是,直接地复制指针地址是一项非常危险的动作,所以只要类有封装指针类型的数据结构,或是类有封装外部引用的数据成员,例如指针类型的数据成员,程序员应该为此而定义显式的复制构造函数与赋值运算符。