类和对象

  • 抽象和类
  • 构造函数和析构函数
  • this指针
  • 对象数组
  • 类作用域
  • 运算符重载
  • 友元
  • 类的自动转换和强制类型转换

抽象和类

  • 指定基本类型完成了三项工作:

    1. 决定数据对象需要的内存数量;
    2. 决定如何解释内存中的位(long和float在内存中占用的位数相同,但将它们转换为数值的方法不同);
    3. 决定可使用数据对象执行的操作或方法。

    对于内置类型来说,有关操作的信息被内置到编译器中。但在C++中定义用户自定义的类型时,必须自己提供这些信息。这也就是定义类的时候需要做的工作。

  • 一般来说,类规范由两个部分组成:

    1. 类声明:以数据成员的方式描述数据部分,以成员函数(被称为方法)的方式描述公有接口;
    2. 类方法定义:描述如何实现类成员函数。
  • 由于隐藏数据是OOP主要的目标之一,因此数据项通常放在私有部分,组成类接口的成员函数放在公有部分;否则,就无法从程序中调用这些函数。也可以把成员函数放在私有部分中,不能直接从程序中调用这种函数,但公有方法却可以使用它们。通常,程序员使用私有成员函数来处理不属于公有接口的实现细节。

  • 类和结构唯一的区别是,结构的默认访问类型是public,而类为private。C++程序员通常使用类来实现类描述,而把结构限制为只表示纯粹的数据对象(常被称为普通老式数据(POD, Plain Old Data))。

  • 其定义位于类声明中的函数都将自动成为内联函数,类声明常将短小的成员函数作为内联函数。

  • 为了避免成员名和参数名的冲突,有以下两种常用方式避免混乱:

    1. 一种常见做法是在数据成员名中使用m_前缀;
    2. 另一种常见做法是,在成员名中使用后缀_
  • 为了保证函数不会修改调用对象,可以将const关键字放在函数的括号后面:

    void show() const;
    
    void stock::show() const{}
    

构造函数和析构函数

  • 构造函数是一种特殊的类成员函数,在创建类对象时被调用。构造函数的名称和类名相同,但通过函数重载,可以创建多个同名的构造函数,条件是每个函数的特征标(参数列表)都不同。另外,构造函数没有声明类型。通常,构造函数用于初始化类对象的成员,初始化应与构造函数的参数列表匹配。

  • 默认构造函数没有参数,因此如果创建对象时没有进行显式地初始化,则将调用默认构造函数。如果程序中没有提供任何构造函数,则编译器会为程序定义一个默认构造函数;否则,必须自己提供默认构造函数。默认构造函数可以没有任何参数;如果有,则必须给所有参数都提供默认值。

  • 对于未被初始化的对象,程序将使用默认构造函数来创建。

  • 就像对象被创建时程序将调用构造函数一样,当对象被删除时,程序将调用析构函数。每个类都只能有一个析构函数。析构函数没有返回类型(连void都没有),也没有参数,其名称为类名称前加上~

this指针

  • 每个成员函数(包括构造函数和析构函数)都有一个this指针。this指针指向调用对象。如果方法需要引用整个调用对象,则可以使用表达式*this。在函数的括号后面使用const限定符将this限定为const,这样将不能使用this来修改对象的值。

对象数组

  • 可以用构造函数来初始化数组元素。在这种情况下,必须为每个元素调用构造函数:

    const int STKS = 4;
    Stock sotcks[STKS] = {Stock("NanoSmart", 12.5, 20),Stock("Boffo Objects", 200, 2.0),Stock("Monolithic Obelisks", 130, 3.25),Stock("Fleep Enterprises", 60, 6.5)};
    

    这里的代码使用标准格式对数组进行初始化:用括号括起的、以逗号分隔的值列表。

类作用域

  • C++提供了另一种在类中定义常量的方式——使用关键字static

    class Bakery
    {private:static const int Months = 12;double costs[Months];···
    }
    

    这将创建一个名为Months的常量,该常量将与其他静态变量存储在一起,而不是存储在对象中。
    静态成员变量可以实现多个对象共享数据的目标。静态成员变量是一种特殊的成员变量,它被关键字static修饰。注意:static成员变量必须在类声明的外部初始化,static成员变量的内存既不是在声明类时分配,也不是在创建对象时分配,而是在(类外)初始化时分配。反过来说,没有在类外初始化的static成员变量不能使用。

运算符重载

  • 不要返回指向局部变量或临时对象的引用。函数执行完毕后,局部变量和临时对象将消失,引用将指向不存在的数据。

  • C++允许在同一作用域中的某个函数和运算符指定多个定义,分别称为函数重载运算符重载。重载声明是指一个与之前已经在该作用域内声明过的函数或方法具有相同名称的声明,但是它们的参数列表和定义(实现)不相同。当您调用一个重载函数或重载运算符时,编译器通过把您所使用的参数类型与定义中的参数类型进行比较,决定选用最合适的定义。选择最合适的重载函数或重载运算符的过程,称为重载决策

  • 重载限制

    1. 重载后的运算符必须至少有一个操作数是用户定义的类型,这将防止用户为标准类型重载运算符。因此,不能将减法运算符(-)重载为计算两个double值的和,而不是它们的差。虽然这种限制将对创造性有所影响,但可以确保程序正常运行。
    2. 使用运算符时不能违反运算符原来的句法规则。同样,不能修改运算符的优先级。因此,如果将加号运算符重载成将两个类相加,则新的运算符与原来的加号具有相同的优先级。
    3. 不能创建新运算符。
    4. 不能重载下面的运算符:
      • sizeof:sizeof运算符;
      • .:成员运算符;
      • .*:成员指针运算符;
      • :::作用域解析运算符;
      • ?::条件运算符;
      • typeid:一个RTTI运算符;
      • const_cast:强制类型转换运算符;
      • dynamic_cast:强制类型转换运算符;
      • reinterpret_cast:强制类型转换运算符;
      • static_cast:强制类型转换运算符。
    5. 大多数运算符都可以通过成员或非成员函数进行重载,但下面的运算符只能通过成员函数进行重载:
      • =:赋值运算符;
      • ():函数调用运算符;
      • []:下标运算符;
      • ->:通过指针访问类成员的运算符。

友元

  • 通常,公有类方法提供唯一的访问途径,但是有时候这种限制太严格,以致于不适合特定的编程问题。在这种情况下,C++提供了另外一种形式的访问权限:友元。友元有3种:

    1. 友元函数;
    2. 友元类;
    3. 友元成员函数。
      通过让函数成为类的友元,可以赋予该函数与类的成员函数相同的访问权限。
    friend Time operator*(double m, const Time & t);
    
  • 应将友元函数看作类的扩展接口的组成部分。另外,只有类声明可以决定哪一个函数是友元,因此类声明仍然控制了哪些函数可以访问私有数据。总之,类方法和友元只是表达类接口的两种不同机制。

  • 加法运算符需要两个操作数。对于成员函数版本来说,一个操作数通过this指针隐式地传递,另一个操作数作为函数参数显式地传递;对于友元版本来说,两个操作数都作为参数来传递。非成员版本的重载运算符函数所需的形参数目与运算符使用的操作数数目相同;而成员版本所需的参数数目少一个,因为其中的一个操作数被隐式地传递的调用对象。

  • 因为运算符重载是通过函数来实现的,所以只要运算符函数的特征标不同,使用的运算符数量与相应的内置C++运算符相同,就可以多次重载同一个运算符。

  • 标准ANSI C库(C++也有)中有一个rand()函数,它返回一个从0到某个值(取决于实现)之间的随机整数。rand()函数将一种算法用于一个初始种子值来获得随机数,该随机值将用作下一次函数调用的种子,以此类推。这些数实际上是伪随机数。因为10次连续的调用通常将生成10个同样的随机数(具体取决于实现)。然而,srand()函数允许覆盖默认的种子值,重新启动另一个随机数序列。该程序使用time(0)的返回值来设置种子。time(0)函数返回当前时间,通常为从某一个日期开始的秒数。因此,下面的语句在每次运行程序时,都将设置不同的种子,使随机输出看上去更为随机:

    srand(time(0));
    

    头文件cstdlib(以前是stdlib.h)包含了srand()rand()的原型,而ctime()(以前是time.h)包含了time()的原型。C++11使用头文件random中的函数提供了更强大的随机数支持。

类的自动转换和强制类型转换

  • 只有一个参数的类构造函数用于将类型与该参数相同的值转换为类类型。例如,将int值赋给Stonewt对象时,接受int参数的Stonewt类构造函数将自动被调用。然而,在构造函数声明中使用explicit可防止隐式转换,而只允许显式转换。
  • 被称为转换函数的特殊类成员运算符函数,用于将类对象转换为其他类型。转换函数是类成员,没有返回类型、没有参数、名为operator typeName(),其中,typeName是对象将被转换成的类型。将类对象赋给typeName变量或将其强制转换为typeName类型时,该转换函数将自动被调用。

C++ Primer Plus学习(十)——类和对象相关推荐

  1. Java 入门知识学习笔记 (类和对象)

    一.类和对象的定义及关系 1.类是同一类别对象的抽象定义:可以理解为是某一类具体对象的模子,确定对象将会拥有的特性,包括该类对象具备的属性和方法. 2.对象是对类的一种具体化的客观存在,是对类的具体实 ...

  2. 【C++学习】类和对象(中)一招带你彻底了解六大默认成员函数

    前言:在之前,我们对类和对象的上篇进行了讲解,今天我们我将给大家带来的是类和对象中篇的学习,继续深入探讨[C++]中类和对象的相关知识!!! 目录 1. 类的6个默认成员函数 2. 构造函数 2.1概 ...

  3. (JAVA学习笔记) 类与对象小结

    1.类与对象 类是一个抽象的模板: 对象是类的一个具体的实例: 2.方法 方法的定义:修饰符,返回类型,方法名,参数列表,异常抛出,返回值. 方法的调用:静态方法,非静态方法,形参和实参,值传递和引用 ...

  4. java学习(类和对象)

    1.今日导师双选,排名靠前但被拒三次.意难平. 2.简历还在投递中,面试时更注重本科项目经历. 3.研究生阶段,计算机学术?代码能力?哪个重要? 4.循环<可能否>,期待变强... 一.简 ...

  5. 学习-Java类和对象之构造方法与对象创建之求椭圆面积

    任务描述 本关任务:已知椭圆的短半轴长为 15.50,长半轴的长为 20.00,计算椭圆面积. 椭圆的面积公式为S=πab,其中a.b分别为椭圆的短半轴长和长半轴长. 相关知识 为了完成本关任务,你需 ...

  6. C++学习小结 类与对象

    1.类(class) ​ 描述现实世界中的事物,用C++进行编程的时候,通常是将现实世界中的事物用类来进行描述.不是真实存在的,是一种概念.. 用类描述事物的格式: ​ class 类名(标识符名称) ...

  7. Java学习总结——类和对象

    玖--面向对象设计 类( class )和对象( object )是面向对象程序设计最重要的概念.要深入了解 Java 程序语言,一定要树立面向对象程序设计的观念. 一.理解面向对象程序设计 面向对象 ...

  8. Java学习DAY8~类和对象(一)~2021.01.17

    文章目录 1. 类和对象 1.1 简单认识类 1.2 类的定义格式 1.3 尝试定义一个类 2. 类的实例化 2.1 什么是实例化 2.2 类和对象的说明 2.3 常见定义类语法错误 3. 类的成员 ...

  9. 【C++学习】类和对象--对象特性(1)

    构造函数和析构函数 对象的初始化和清理是两个非常重要的安全问题 一个对象或变量没有初始状态,对其使用后果是未知的 使用完一个对象或变量,没有及时清理,也会造成一定的安全问题 C++利用构造函数和析构函 ...

  10. 【C++学习】类与对象(一)——类的定义与对象实例

    一.面向对象程序设计的基本特点 1.1 抽象 面向对象方法中的抽象 ,是指对具体问题(对象)进行概括,抽出一类对象的公共性质并加以描述的过程. 一个问题的抽象包括:数据抽象和行为抽象(或被称为功能抽象 ...

最新文章

  1. 熟悉Linux的环境实验报告,实验1 熟悉Linux开发环境 实验报告
  2. vb破解万能断点816c24
  3. 排除字段重复行的SQL
  4. selenium基础框架的封装(Python版)这篇帖子在百度关键词搜索的第一位了,有图为证,开心!...
  5. 返回一个list的全部 倒叙排列的方法
  6. CaseStudy-数据缓存出错
  7. python数据分析与excel_读Python数据分析基础之Excel读写与处理
  8. php 清除英文字母,PHP英文字母大小写转换函数小结
  9. 嗅探对方机器,获取机器键盘记录
  10. linux命令大全dfs,Linux常用的dfs命令
  11. BRVAH的基本使用
  12. 启动Xshell报错:由于找不到MSVCR110.dll,无法继续执行代码。重新安装程序可能会解决此问题
  13. Android天气预报详解
  14. 无法启动此程序因为计算机中丢失msvcp140d,msvcp140.dll文件丢失修复工具
  15. win10重装系统后,无限自动修复
  16. ASP.NET MVC 分部页 PartialViewResult
  17. Ubuntu实现划词翻译
  18. java实现随机输出26个小写字母
  19. Solidity基础教程2——Safemath
  20. PHP redis配置说明

热门文章

  1. bzoj 4631: 踩气球(线段树)
  2. qscoj:喵哈哈村的卢西奥
  3. 使用原生XMLHttpRequest对象演示ajax(Ajax)功能
  4. jquery事件绑定和解除绑定bind、unbind、one
  5. AlignGAN: Learning to Align Cross-Domain Images with Conditional Generative Adversarial Networks
  6. shell里写个简单循环
  7. 贺利坚老师汇编课程50笔记:call和ret配合
  8. java中mydoc_实验二/MyDoc.java · 20175326李一潇/20175326java - Gitee.com
  9. SpringAOP-基于@AspectJ的简单入门
  10. Centos如何通过yum安装php7