What & How & Why

差别

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

到此差别页面的链接

两侧同时换到之前的修订记录前一修订版
后一修订版
前一修订版
cs:programming:cpp:cpp_primer:15_oop [2024/11/14 15:11] – [表达式是如何以对象的形式表现的] codingharecs:programming:cpp:cpp_primer:15_oop [2024/11/19 14:42] (当前版本) – [“豁免”单个成员] codinghare
行 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 |}} \\ \\
  
 该规则同样适用于拷贝成员。比如拷贝构造函数,析构函数等。需要注意的是,该规则被应用的前提是**基类中对应的拷贝控制成员是可访问的(没有被删除的)**,而与成员是否是合成的并没有关系。 该规则同样适用于拷贝成员。比如拷贝构造函数,析构函数等。需要注意的是,该规则被应用的前提是**基类中对应的拷贝控制成员是可访问的(没有被删除的)**,而与成员是否是合成的并没有关系。