What & How & Why

差别

这里会显示出您选择的修订版和当前版本之间的差别。

到此差别页面的链接

两侧同时换到之前的修订记录前一修订版
后一修订版
前一修订版
cs:programming:cpp:cpp_primer:15_oop [2024/01/14 13:46] – ↷ 页面programming:cpp:cpp_primer:15_oop被移动至cs:programming:cpp:cpp_primer:15_oop codingharecs:programming:cpp:cpp_primer:15_oop [2024/11/19 14:42] (当前版本) – [“豁免”单个成员] codinghare
行 152: 行 152:
   * **继承部分**:该部分也是一个子对象,包含了所有继承自基类的成员   * **继承部分**:该部分也是一个子对象,包含了所有继承自基类的成员
 比如 //Bulk_quote// 的对象,实际上的组成是下面这样的: 比如 //Bulk_quote// 的对象,实际上的组成是下面这样的:
-\\ <html><div align="center"> <img src="/_media/programming/cpp/cpp_primer/derived_obj.svg width="450"> </div> </html> \\ \\+\\ {{ :cs:programming:cpp:cpp_primer:derived_obj.svg?400 |}} \\ \\
 因为派生类对象包含了对应的基类成员,因此我们可以像使用基类对象一样使用派生类对象。具体的来说,我们可以将**基类的引用或指针**绑定到**派生类对象中的基类部分**上: 因为派生类对象包含了对应的基类成员,因此我们可以像使用基类对象一样使用派生类对象。具体的来说,我们可以将**基类的引用或指针**绑定到**派生类对象中的基类部分**上:
 <code cpp> <code cpp>
行 276: 行 276:
   * 静态类型指**变量声明时定义**的类型,或是**表达式得出的结果**的类型。这类类型在**编译期就能确认**   * 静态类型指**变量声明时定义**的类型,或是**表达式得出的结果**的类型。这类类型在**编译期就能确认**
   * 动态类型指**变量或者表达式在内存中表示的实际类型**,这类类型往往需要在**运行期**才能确认   * 动态类型指**变量或者表达式在内存中表示的实际类型**,这类类型往往需要在**运行期**才能确认
-以 ''print_total'' 函数为例,其接受一个 ''Quote&'' 类型的参数,因此该参数的静态类型是 ''Quote&''。当我们提供一个 ''Bulk_quote'' 对象给该参数时,该参数的动态类型就是 ''Bulk_quote''。\\ \\ +以 ''print_total'' 函数为例,其接受一个 ''Quote&'' 类型的参数,因此该参数的静态类型是 ''Quote&''。当我们提供一个 ''Bulk_quote'' 对象给该参数时,该参数的动态类型就是 ''Bulk_quote&''。\\ \\ 
 <WRAP center round info 100%> <WRAP center round info 100%>
 需要注意的是,如果表达式的类型(接受参数的类型)**不是指针或者引用类型**,那么其静态类型与动态类型是**一**致的。 需要注意的是,如果表达式的类型(接受参数的类型)**不是指针或者引用类型**,那么其静态类型与动态类型是**一**致的。
行 579: 行 579:
 }; };
 </code> </code>
-===“豁免”单个成员===+===使用 using “豁免”单个成员===
 如果希望对某个指定的成员进行访问级别的变更,我们可以使用 ''using'' 声明: 如果希望对某个指定的成员进行访问级别的变更,我们可以使用 ''using'' 声明:
 <code cpp> <code cpp>
行 806: 行 806:
 C++ 中,派生类中的**合成拷贝控制成员**,在处理基类部分的资源时,会调用**基类中对应的拷贝控制成员**来处理。比如之前的 ''Quote'' 实例: C++ 中,派生类中的**合成拷贝控制成员**,在处理基类部分的资源时,会调用**基类中对应的拷贝控制成员**来处理。比如之前的 ''Quote'' 实例:
   * ''Bluk_quote'' 的合成构造函数会调用 ''Disc_quote'' 中的构造函数,也就是 ''Quote'' 的构造函数   * ''Bluk_quote'' 的合成构造函数会调用 ''Disc_quote'' 中的构造函数,也就是 ''Quote'' 的构造函数
-  * ''Quote'' 的默认构造函数为 ''Disc_quote'' 直接基类部分 ''bookNo'' 和 ''price'' 进行初始化,之后由 ''Disc_quote'' 对 ''Bluk_quote'' 的直接基类部分 ''qty'' 和 ''discount'' 进行初始化。 +  * ''Quote'' 的默认构造函数对 ''Disc_quote'' 直接基类部分 ''bookNo'' 和 ''price'' 进行初始化,之后由 ''Disc_quote'' 对 ''Bluk_quote'' 的直接基类部分 ''qty'' 和 ''discount'' 进行初始化。 
-  * 整个过程类似于一个递归的过程,最内层的基类中的成员会被首先初始化+  * 整个过程类似于一个递归的过程,最内层的基类 ''Quote'' 中的成员 ''bookNo'' 会被首先初始化
  
-\\ <html><div align="center"> <img src="/_media/programming/cpp/cpp_primer/cp_ctrl_derive.svg width="300"> </div> </html> \\ \\+\\ {{ :cs:programming:cpp:cpp_primer:cp_ctrl_derive.svg?300 |}} \\ \\
  
 该规则同样适用于拷贝成员。比如拷贝构造函数,析构函数等。需要注意的是,该规则被应用的前提是**基类中对应的拷贝控制成员是可访问的(没有被删除的)**,而与成员是否是合成的并没有关系。 该规则同样适用于拷贝成员。比如拷贝构造函数,析构函数等。需要注意的是,该规则被应用的前提是**基类中对应的拷贝控制成员是可访问的(没有被删除的)**,而与成员是否是合成的并没有关系。
行 1229: 行 1229:
   * ''eval()'',接收的 //TextQuery// 对象,返回 //QueryResult// 对象,也就是根据已有字典查询,查询的结果经过处理,输出为 //QueryResult// 对象做最后处理   * ''eval()'',接收的 //TextQuery// 对象,返回 //QueryResult// 对象,也就是根据已有字典查询,查询的结果经过处理,输出为 //QueryResult// 对象做最后处理
   * ''rep()'',将返回一个 string 用于表示输出结果中的关键词(也就是上例子中 occur 后的那一行表达式)   * ''rep()'',将返回一个 string 用于表示输出结果中的关键词(也就是上例子中 occur 后的那一行表达式)
-\\ \\ <html><div align="center"> <img src="/_media/programming/cpp/cpp_primer/basic_flow_query.svg width="600"> </div> </html> \\ \\+\\ \\ {{ :cs:programming:cpp:cpp_primer:basic_flow_query.svg?600 |}}\\ \\
 <WRAP center round box 100%> <WRAP center round box 100%>
 recover: //TextQuery// 对象是从导入的数据中的词为单位,并存储这些词所在对应行的数据对象;同时,//TextQuery// 带有成员函数 //query()// 用于对单个关键词进行输出。 //QueryResult// 存储的是指定的关键词,以及其在 //TextQuery// 中对应的行信息。 recover: //TextQuery// 对象是从导入的数据中的词为单位,并存储这些词所在对应行的数据对象;同时,//TextQuery// 带有成员函数 //query()// 用于对单个关键词进行输出。 //QueryResult// 存储的是指定的关键词,以及其在 //TextQuery// 中对应的行信息。
行 1263: 行 1263:
 ==表达式是如何以对象的形式表现的== ==表达式是如何以对象的形式表现的==
 根据之前的内容,我们的表达式的最终结果,实质上是**不同单个关键词查询结果的逻辑运算**。因此,一个查询表达式的执行,实际上是在以 ''WordQuery'' 为单位构建执行的过程: 根据之前的内容,我们的表达式的最终结果,实质上是**不同单个关键词查询结果的逻辑运算**。因此,一个查询表达式的执行,实际上是在以 ''WordQuery'' 为单位构建执行的过程:
-\\ \\ <html><div align="center"> <img src="/_media/programming/cpp/cpp_primer/expression_create.svg width="500"> </div> </html> \\ \\+\\ \\ {{ :cs:programming:cpp:cpp_primer:expression_create.svg?500 |}} \\ \\
 而具体执行的过程,也是按照这个树的顺序进行调用,直到达到最基本的单位时得出查询结果后,再依次返回上级,进行最后的结果的运算(类似递归的概念)。 而具体执行的过程,也是按照这个树的顺序进行调用,直到达到最基本的单位时得出查询结果后,再依次返回上级,进行最后的结果的运算(类似递归的概念)。
 ===Query_Base & Query 的实现=== ===Query_Base & Query 的实现===