热门问题
时间线
聊天
视角

三法则

C++程式設計 来自维基百科,自由的百科全书

Remove ads

三法则(英语:Rule of Three)以及五法则C++里,它是一个以设计的基本原则而制定的定律。

规则

它的要求是,假如有明显定义英语Declaration (computer programming)下列其中一个成员函数,那么程序员必须写入其他两个成员函数到类内,也就是说下列三个成员函数缺一不可[注 1] [1]

上述三个函数是特别的成员函数英语Special member functions,假如程序员没有自行定义或宣告这三个函数,编译器会自动地建立他们并且编译到应用程序内。然而,如果程序员仅定义其中一个,其余两个函数仍然会由编译器自动产生,这种混杂的情况非常容易产生程序员难以预期的错误。三法则的存在,正是提醒程序员避免那样的陷阱。 三法则这个专有名词是由马歇尔·克来恩于1991年创立[注 2][2]

它的修正版本是,假如类有用到RAII,可以不必定义析构函数,也就是所谓的二大定律[注 3][3]。 因为隐式生成的构造函数与赋值运算符可以很容易地复制类内所有的资料成员[4],当资料成员是指针类型时,指针地址会随着类而跟着被复制[注 4]。要注意的是,直接地复制指针地址是一项非常危险的动作,所以只要类有封装指针类型的数据结构,或是类有封装外部引用的资料成员,例如指针类型的资料成员,程序员应该为此而定义显式的复制构造函数与赋值运算符[注 5]

Remove ads

五法则

C++11新增两个法则,称为五法则[注 6]

  • 析构函数
  • 复制构造函数
  • 赋值运算符
  • 移动构造函数[注 7]
  • 移动复制运算符[注 8]

示例

更多信息 头文件 header.h, 主函数 main.cpp ...
Remove ads

注释

  1. 三法则,英语:Rule of Three;三大定律,英语:the Law of The Big Three;大三律,英语:The Big Three
  2. 马歇尔·克来恩,英语:Marshall Cline
  3. 二大定律,英语:The Law of The Big Two
  4. 隐式生成,英语:implicitly-generated,由编译器自动产生
  5. 显式,英语:explicit,由程序员来编写清楚明确的定义
  6. 五法则,英语:Rule of Five
  7. 移动构造函数,英语:move constructor
  8. 移动指定运算符,英语:move assignment operator

参考资料

参见

Loading related searches...

Wikiwand - on

Seamless Wikipedia browsing. On steroids.

Remove ads