1个回答
展开全部
三法则(英语:rule of three,the Law of The Big Three,The Big Three;三法则,三大定律)在 C++ 程序设计里,它是一个以设计的基本原则而制定的定律,三法则的要求在于,假如类有明显地定义下列其中一个成员函数,那么程序员必须连其他二个成员函数也一同编写至类内,亦即下列三个成员函数缺一不可。:
析构函数(Destructor)
复制构造函数(copy constructor)
复制赋值运算符(copy assignment operator)
上述三个函数是特别的成员函数,假如程序员没有自行定义或是编写声明它们,那么编译器会自动地创建它们,并且会编译至应用程序内。相反地,假如程序员有定义上述三者其中一个函数,那么由编译器自动产生出来的上述三个函数是不会搭配到这个类内。三法则(Rule of three)这个专有名词是由 Marshall Cline 于 1991 年创立的。
这个法则的修正版本是,假如析构函数有用到 RAII(资源的取得就是初始化,Resource Acquisition Is Initialization),可以使得析构函数的定义更加明确(也就是所谓的二大定律,The Law of The Big Two[3])。
因为隐性产生(英语:implicitly-generated;由编译器自动产生)的构造函数与赋值运算符可以很容易地复制类内所有的数据成员[4],当数据成员是指针型态时,指针地址会随着类而跟着被复制,要注意的是,直接地复制指针地址是一项非常危险的动作,所以只要类有封装指针型态的数据结构,或是类有封装外部引用的数据成员(例如:指针型态的数据成员),程序员应该为此定义显性的(英语:explicit;由程序员来编写清楚明确的)复制构造函数,以及复制赋值运算符。
PS.
根据我的理解,用到自己写析构的话一般得释放自己分配的空间,而涉及到自己分配空间的话,其成员变量就有指针等类型,这样的话就得自己写赋值操作符和复制构造函数了
析构函数(Destructor)
复制构造函数(copy constructor)
复制赋值运算符(copy assignment operator)
上述三个函数是特别的成员函数,假如程序员没有自行定义或是编写声明它们,那么编译器会自动地创建它们,并且会编译至应用程序内。相反地,假如程序员有定义上述三者其中一个函数,那么由编译器自动产生出来的上述三个函数是不会搭配到这个类内。三法则(Rule of three)这个专有名词是由 Marshall Cline 于 1991 年创立的。
这个法则的修正版本是,假如析构函数有用到 RAII(资源的取得就是初始化,Resource Acquisition Is Initialization),可以使得析构函数的定义更加明确(也就是所谓的二大定律,The Law of The Big Two[3])。
因为隐性产生(英语:implicitly-generated;由编译器自动产生)的构造函数与赋值运算符可以很容易地复制类内所有的数据成员[4],当数据成员是指针型态时,指针地址会随着类而跟着被复制,要注意的是,直接地复制指针地址是一项非常危险的动作,所以只要类有封装指针型态的数据结构,或是类有封装外部引用的数据成员(例如:指针型态的数据成员),程序员应该为此定义显性的(英语:explicit;由程序员来编写清楚明确的)复制构造函数,以及复制赋值运算符。
PS.
根据我的理解,用到自己写析构的话一般得释放自己分配的空间,而涉及到自己分配空间的话,其成员变量就有指针等类型,这样的话就得自己写赋值操作符和复制构造函数了
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询