类和数据抽象

1.常量对象和常量成员函数

    (1)最低权限原则

      a.使用关键字const指定不能够被修改的对象,将对象声明为常量对象有利于实现最低权限原则,试图修改对象会产生编译错误而非执行时错误,将变量或者对象声明为const类型可以提高软件性能,编译器能够对常量进行某些无法对变量进行的优化;

      b.C++编译器不允许任何非const成员函数调用const对象,没有声明为const的成员函数可以对对象进行修改,即便这些函数并没有对对象进行修改;

      c.声明为const的成员函数不能修改对象

      d.把修改对象数据成员的成员函数定义为const是语法错误

      e.对常量对象调用非常量成员函数是语法错误,因为非常量成员函数会修改对象;

      f.将构造函数和析构函数定义为const是语法错误;

      g.尽管构造函数和析构函数不是const函数,但仍可以对常量对象调用构造函数,常量对象不能用赋值语句修改,所以必须初始化,如果类的数据成员声明为const,要用成员初始化值向构造函数提供类对象数据成员的初始值;所有的数据成员都可以用成员初始化值的语法进行初始化,但常量和引用必须使用这种方式进行初始化。

      h.不为常量数据成员提供成员初始化值是语法错误,常量类成员(常量对象和常量变量)要用成员初始化值来初始化,不能够用普通的赋值语句。

 

2.合成:对象作为类成员

     类可以将其他类的对象作为自己的成员,生成成员对象时,会自动调用其构造函数,因此需要指定如何将参数传递给成员对象的构造函数,成员对象按照声明的顺序建立,而且发生在建立包含他们的类对象之前;

     对象由内向外建立,由外向内删除,成员对象不需要通过成员初始化值显示初始化,如果没有提供成员初始化值,将隐式调用成员对象的默认构造函数,默认构造函数可以用set函数重定义,通过成员初始化值显式初始化成员对象,可以避免两次初始化成员对象的开销,一次是调用默认的构造函数,一次是用set函数初始化成员对象;

     既不为成员对象提供成员初始化值,又不为成员对象的类提供默认的构造函数会造成语法错误,灭个非static成员函数包含所操作对象的隐式句柄。

 

3.友元函数和友元类

   类的友元函数在类作用域之外定义,但有权访问类的private和protected成员,函数或者整个类都可以声明为另一个类的友元函数或类。

  要将一个函数声明为类的友元,应在类定义的函数原型前加上关键字friend,要将ClassTwo类声明为类ClassOne的友元,应在ClassOne的定义中进行如下声明: friend class ClassTwo

  尽管类定义中有友元函数的原型,但友元函数仍然不是成员函数,友元关系是指定的,不具有对称性和传递性。

 

  重点理解:C++属于混合语言,常在同一个程序中采用两种函数调用且这两种函数调用往往相反,类C语言的调用将基本数据类型或者对象传递给函数,C++的调用则是将函数传递给对象。

 

4.this指针

   每个对象都可以通过this指针访问自己的地址;

   对象的this指针不属于对象本身的一部分,this指针不会出现在该对象的sizeof操作结果中;

   this指针会在每次非static成员函数调用对象时作为第一个隐式参数传递给对象(通过编译器)

   this指针的类型取决于对象的类型和使用this指针的成员函数是否声明为常量,在类Employee的非常量成员函数中,this指针的类型被定义为Employee* const(指针的内容不能变),在类Employee的常量成员函数中,this指针的类型为const Employee * const(指针所指的地址不能变,指针所指的对象内容也不能变) 

 

  5.用new和delete实现动态内存分配

   C malloc free

   C++ new delete

 

  new操作符自动生成长度正确的对象并调用对象的构造函数和返回正确类型的指针

  new调用对象的构造函数,delete调用对象的析构函数;

 

   6.静态类成员

      类的每个对象都有其所有数据成员的副本,某些情况下只有一个变量副本供类的所有对象共享,静态类变量表示整个类范围中共享的信息,静态成员的声明用关键字static开始;

      static数据成员有类作用域,静态成员可以是private,public或者protected

      a.静态数据成员在文件范围内必须进行一次初始化(因为必须要有一个副本);

      b.public静态成员可以通过类的任何对象访问,也可以用二元作用域分辨符通过类名进行访问,private或者protected成员只能通过成员函数或者友元函数进行访问

      c.即使类没有对象,但仍然有静态成员,类没有对象时,要访问public静态类成员,只需在成员数据名称前加上类名和二元作用域运算符,在类没有对象要访问private或者protected类型的static成员时,需要提供一个public静态成员函数,并且加上类名和二元作用域运算符。

      d.静态成员没有this指针,因为静态数据成员和成员函数是独立于对象而存在的,this指针保存的是对象实例在内存中的地址。

    

      删除动态分配的内存后,将指向该内存的指针设置为指向0,以切断指针与前面已分配的内存的链接。

 

7.C++中的数据抽象和信息隐藏

(1)   数据抽象是描述与其实现细节无关的类,C++的类定义了抽象数据类型,尽管用户可能知道类的实现细节,但不应编写依赖这些细节的代码,只要类的public接口不变,其实现细节可以在不影响系统其他部分的情况下发生改变或者被替换;

(2)  在C中,数据的存在是为了支持程序所需要的操作,数据和操作相比,要次要很多,数据是原始的,内部数据类型也很少,程序员很难生成自己的新的数据类型。

         C++提高了数据的重要性,C++的主要操作是生成自己的新的数据类型和表达这些数据类型之间的相互作用;

         C++提供的数据类型,知识实际生活中概念和行为的近似或者模型,任何抽象数据类型,都是计算机系统内,用可以接受的方式比啊是实际概念;

         抽象数据类型实际包含两个概念,数据表达和该数据允许的操作,C++程序员用类实现抽象数据类型

         利用类的概念,用户可以开发精彩的ADT,数组类可以提供很多新的功能,程序员可以通过类机制生成新的类型,这些新的类型设计好之后,可以向使用内部类型一样方便地使用,因此C++是可扩展的语言

         a.利用C++生成的新类可以专属一个人,一个小组或一个公司,也可以放入标准库中,ANSI和ISO已经开发了包含标准类库的C++标砖版本,可以利用丰富的库实现快速面向组件的软件开发。

         b.C++想程序员题哦国内建立各种系统的原始功能,它是一种生成系统的工具,标准库中有string类

         c.标准库中有vector类(类似于数组)和queue类,ADT保证内部数据结构的完整性,客户代码不能直接操作这个数据结构,只有更成员函数能够访问内部数据,客户只能对数据表达进行合理的操作,ADT的public接口不提供的操作将被ADT以适当的方式拒绝,可以发送错误消息或者终止执行。

8.容器类和迭代器

    容器类:将类设计为保存一组对象集合,容器类通常提供插入,删除,查找,排序和测试类成员项目等操作,确定该容器是否是集合的成员

    容器类通常和迭代其关联,迭代器返回集合中下一个项目的对象;

 

8.代理类

 

    隐藏实现方法细节可以防止访问类的专属信息和专属程序逻辑,想客户代码提供代理类,代理类只能访问类的public接口,这样既可以让客户使用类的服务有防止客户访问类的实现细节。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值