深度探索C++对象模型之第一章:关于对象之对象的差异

C++程序设计模型支持三种程序设计范式(programming paradiams).

  • 程序模型(procedural model)
char boy[] = "ccpang";
char *p_son;

p_son = new char[strlen(boy) +1 ];
strcpy(p_son,boy);

if(!strcmp(p_son,boy))
   take_to_disneyland(boy);
  • 抽象数据模型(abstract data type model)

    此模型的抽象是和一组表达式(public接口)一起提供,那时其运算定义仍然隐而未明的。

1 String girl = "Anna"
2 String daughter;
3
4 //String ::operator();
5 daughter = girl;
6
7 //String::operator == ();
8 if(girl ==daughter)
9       take_to_disneyland(girl);
  • 面向对象模型(object-orlented model)

    此模型中有一些彼此相关的类型,通过一个抽象的基类(用以提供共同接口)被封装起来。Library_materials class就是一个例子,真正的子类例如Book、Video、等均可以从那里派生而来。

1 void check_in (Library_materials *pmat)
2 {
3    if(pmat ->late())
4        pmat->fine();
5 pmat->check_in();
6
7     if(Lender *plend = pmat->reserved())
8           pmat->notify(plend);
9 }


  只以一种程序设计范式写代码,有助于整体行为的良好稳固。如果混合了不同的范式,就可能会带来让人吃惊的后果。常出现的问题如下所示:

  以一个基类的具体实例来完成某种多态(polymorphism)情况是时:

 1 Library_materials thing1;
 2
 3 //class Book : public Library_materials{....};
 4 Book book;
 5
 6 //thing1不是一个book,book被裁减了(sliced)
 7 thing1 = book;
 8
 9 //调用的是Library_materials::check_in()
10 thing1.check_in();
11
12 //通过基类的指针或引用来完成多态局面:
13 Library_materials &thing2 = book;
14
15 //现在使用的是Book::check_in()
16 thing2.check_in();
 

原文地址:https://www.cnblogs.com/ccpang/p/11360305.html

时间: 2024-11-13 08:52:33

深度探索C++对象模型之第一章:关于对象之对象的差异的相关文章

【深度探索C++对象模型】第一章 关于对象

第一章 关于对象(Object Lessons) -- 本书作者:Stanley B.Lippman 一.前言 什么是 C++ 对象模型:简单的说,就是 C++ 中面向对象的底层实现机制. 本书组织: 第 1 章,关于对象(Object Lessons),介绍 C++ 对象的基础概念,给读者一个粗略的了解. 第 2 章,构造函数语意学(The Semantics of Constructors),构造函数什么时候会被编译器合成?它给我们的程序效率带来了怎样的影响? 第 3 章,Data语意学(T

【深度探索C++对象模型】第二章 构造函数语意学(上)

第二章 构造函数语意学(The Semantics of Constructors) -- 本书作者:Stanley B.Lippman 一.前言 首先让我们来梳理一个概念: 默认构造函数(Default Constructor) : 是在没有显示提供初始化式时调用的构造函数.它由不带任何参数的构造函数,或是为所有形参提供默认实参的构造函数定义.如果定义的某个类的成员变量没有提供显示的初始化式时,就会调用默认构造函数(Default Contructor). 如果用户的类里面,没有显示的定义任何

深度探索C++对象模型 第三章 Data 语意学

一个有趣的问题:下列 类 sizeof大小 class X{}    //1 class Y:public virtual X{} //4 or 8 class Z:public virtual X{} // 4 or 8 class A:public Y,public Z{} // 8 or 12 主要原因:为了保持每一个类生成对象在内存中的唯一性,编译器必须要给空类生成一个char来维持object的唯一性: 而virtual继承中,仅保持了base class的指针,有些编译器会继承bas

深度探索C++对象模型 第五章 构造、析构、拷贝语意学

1. const 成员函数需要吗? 尽量不要,如果存在继承,则无法预支子类是否有可能改变data member 2. pure virtual constructor 可以实现类的隐藏吗(包含data member)?   这样子类无法调用base 的构造函数对数据初始化,所以可以用protected来实现构造函数,可以实现子类调用: 3. 如果class中存在virtual function,则编译器会再构造函数中对vptr进行初始化(在base构造函数调用之后,而代码实现之前) 4.拷贝构造

深度探索C++对象模型第6章 执行期语意学

(一)对象的构造和析构(Object Construction and Destruction) 一般而言我们会把object尽可能放置在使用它的那个程序区段附近,这么做可以节省非必要的对象产生操作和摧毁操作. 全局对象 如果我们有以下程序片段: Matrix identity main() { //identity 必须在此处被初始化 Matrix m1=identity; ... return 0; } C++保证,一定会在main()函数中第一次用到identity之前,把identity

《深度探索C++对象模型》第二章 | 构造函数语意学

默认构造函数的构建操作 默认构造函数在需要的时候被编译器合成出来.这里"在需要的时候"指的是编译器需要的时候. 带有默认构造函数的成员对象 如果一个类没有任何构造函数,但是它包含一个成员对象,该成员对象拥有默认构造函数,那么这个类的隐式默认构造函数就是非平凡的,编译器需要为该类合成默认构造函数.为了避免合成出多个默认构造函数,编译器会把合成的默认构造函数.拷贝构造函数.析构函数和赋值拷贝操作符都以内联的方式完成.一个内联含有具有静态链接,不会被文件以外者看到.如果函数不适合做成内联,就

《Android深度探索》卷1 第一章笔记

1.Android系统架构第一层:Linux内核,第二层:C/C++代码库,第三层:Android SDK API,第四层:应用程序. 2.驱动是与硬件直接交互的一类程序,设备驱动对于系统的运行与硬件的使用很关键. 3.Linux把存储器和外设分为三大类:字符设备.块设备和网络设备.Linux内核和网络设备的通信和字符设备与块设备的通信方式截然不同,网络设备面向数据包的接收与发送而设计.可以将字符设备与块设备归为一类,它们全是可以顺序/随机地进行读取与存储的单元,网络设备是特殊设备的驱动,它负责

深度探索C++对象模型之第二章:构造函数语意学之Default constructor的构造操作

C++新手一般由两个常见的误解: 如果任何class没有定义默认构造函数(default constructor),编译器就会合成一个来. 编译器合成的的default constructor会显示的设定“class内每一个data member的默认值” 一.编译器在哪种情况下才会合成默认构造函数: 对于未声明构造函数的类,只有在以下四种情况下编译器才会为它们合成默认构造函数: 类的成员有一个类对象(Member Class Object),且该成员含有默认构造函数(default Const

深度探索C++对象模型 第二章构造函数语意学

在使用C++时,常常会好奇或者抱怨,编译器为我们做了什么事呢? 为什么构造函数没有为我初始化呢?为什么我还要写默认构造函数呢? 2.1 Default Constructor 的构造操作 如果没有声明默认构造函数,编译器会在需要的时候帮我们产生出来. 为了避免在多个地方被需要导致重复,则编译器将产生的构造函数声明为inline方式. class Foo {public:Foo(), Foo(int) }; class Bar {public: Foo foo;char *str;} Bar ba