1  最简单地说,类即使定义了一个新的类型和一个新的作用域。

2  基础

1  构造函数

构造函数一般应使用一个构造函数初始化列表,来初始化对象的数据成员。

Sales_item(): units_sold(0), revenue(0.0)  {};

2  成员函数

在类内部定义的函数默认为inline.

将关键字const加在形参表之后,就可以将成员函数声明为常量:

double avg_price() const;

const成员不能改变其所操作的对象的数据成员。const必须同时出现在声明和定义中,若只出现在其中一处,就会出现一个编译时错误。

习题12.1:

using namespace std;
class Person {private:string name;string address;
}

习题12.2:

using namespace std;
class Person {Persion(string &name, string &addr){}private:string name;string address;
};

习题12.3:

using namespace std;
class Person {Persion(string &name, string &addr){}private:string name;string address;public:string getName() const{return self.name;}string getAddr() const{return self.address;}
};
返回名字和地址的操作不应该修改成员变量的值,所以应该指定成员函数为const。

习题12.4:

name和address为private实现数据隐藏, 函数getName() 和getAddr()为public提供接口,构造函数通常也为public.

3  数据抽象和封装

在C++中,使用访问标号(public, private, protected)来定义类的抽象接口和实施封装。

两个优点:

  • 避免类内部出现无意的,可能破坏对象状态的用户级错误;
  • 随时间推移可以根据需求改变或缺陷报告来完善类实现,而无需改变用户级代码。

习题12.5:

C++支持三种访问标号,public private protected

习题12.6:

class关键字定义的类,默认的访问权限为private,struct关键字定义的类,默认的访问权限是public。

习题12.7:

封装是一种将低层次的元素组合起来形成新的,高层次实体的技术。

封装隐藏了内部元素的实现细节。

4 使用类型别名来简化类

类可以定义自己的局部类型的名字。

class Screen {
public:// interface member functionstypedef std::string::size_type index;
private:std::string contents;index cursor;index height, width;
};

可以在类定义体内指定一个成员为inline,作为其声明的一部分,或者,也可以在类定义体外部的函数定义上指定inline。在声明和定义处指定inline都是合法的。

注意:inline成员函数的定义必须在调用该函数的每个源文件中是可见的,不在类体内定义的inline成员函数,其定义通常应放在有类定义的同一头文件中。

12.8:

class Sales_item {public:double avg_price() const;bool same_isbn(const Sales_item &rhs) const{return isbn == rhs.isbn;}private:std:string isbn;unsigned units_sold;double revenue;
};
inline double Sales_item :: avg_price() const
{if (units_sold) return revenue/units_sold;elsereturn 0;
}

其他的两种写法:

  • 将成员函数的定义写在类内部;
  • 在类内部进行成员函数的声明时,指定inline关键字。

习题12.9:

class Screen {
public:// interface member functionstypedef std::string::size_type index;Screen(index ht, index wt, const std::string &cntnts){height = ht;width = wt;contents = cntnts;}
private:std::string contents;index cursor;index height, width;
};

转载于:https://www.cnblogs.com/suzhou/p/3638972.html

细嚼慢咽C++primer(4)——类(1):构造函数,类型别名相关推荐

  1. JS-9 JS常见内置类;包装类型;Number类方法与实例方法;Math方法;String类常见方法;数组方法(增删改查+遍历+排序);时间Date 构造函数+获取信息+设置信息+获取Unix时间戳

    目录 1_包装类型 2_Number类补充 3_Math对象 4_String类的补充 4.1_基本使用 4.2_修改字符串 4.3_查找.替换字符串 开头与结尾 4.4_获取子字符串 4.5_其他方 ...

  2. 【C++ Primer 第15章】定义派生类拷贝构造函数、赋值运算符

    学习资料 • 派生类的赋值运算符/赋值构造函数也必须处理它的基类成员的赋值 • C++ 基类构造函数带参数的继承方式及派生类的初始化 定义拷贝构造函数 [注意]对派生类进行拷贝构造时,如果想让基类的成 ...

  3. C++ Primer 与“类”有关的注意事项总结

    C++ 与"类"有关的注意事项总结(一) 1. 除了静态 static 数据成员外,数据成员不能在类体中被显式地初始化. 例如 : class First { int memi = ...

  4. c++, 派生类的构造函数和析构函数 , [ 以及operator=不能被继承 or Not的探讨]

    说明:文章中关于operator=实现的示例,从语法上是对的,但逻辑和习惯上都是错误的. 参见另一篇专门探究operator=的文章:<c++,operator=>http://www.c ...

  5. 判断exception类型_C++核心准则T.44:使用函数模板推断类模板参数类型(如果可能)...

    T.44: Use function templates to deduce class template argument types (where feasible) T.44:使用函数模板推断类 ...

  6. C++类的构造函数不能为虚函数的原因

    1 C++类的对象构造的时候,首先申请一片内存,然后调用构造函数进行初始化: 我们知道,存在虚函数的话,也会存在一个虚函数表vtable,而虚函数表示在什么时候产生的呢,当然是在调用构造函数之后产生的 ...

  7. c++类的构造函数详解

    c++构造函数的知识在各种c++教材上已有介绍,不过初学者往往不太注意观察和总结其中各种构造函数的特点和用法,故在此我根据自己的c++编程经验总结了一下c++中各种构造函数的特点,并附上例子,希望对初 ...

  8. 类的构造函数和析构函数详解

    一:类的构造函数 1.构造函数定义 类的构造函数是类的一种特殊的成员函数,它会在每次创建类的新对象时执行. 构造函数的名称与类的名称是完全相同的,并且不会返回任何类型,也不会返回 void.构造函数可 ...

  9. 类模板,多种类型的类模板,自定义类模板,类模板的默认类型,数组的模板实现,友元和类模板,友元函数,类模板与静态变量,类模板与普通类之间互相继承,类模板作为模板参数,类嵌套,类模板嵌套,类包装器

     1.第一个最简单的类模板案例 #include "mainwindow.h" #include <QApplication> #include <QPush ...

最新文章

  1. 2021年大数据Flink(二十四):​​​​​​​Allowed Lateness案例演示
  2. python3 打印异常堆栈信息
  3. python自定义分页器()转自https://www.cnblogs.com/yuanchenqi/articles/7652353.html
  4. maven学习6 Eclipse下Tomcat常用设置
  5. new A和new A()的区别详解
  6. C# 从Excel中读取时间数据
  7. oracle堆表和MySQL_聚簇索引对比|Oracle vs MySQL
  8. 关于Rxjava的几个问题
  9. nrf52832芯片资料_蓝牙大举进军智能楼宇、智慧工业等新兴领域,主流BLE芯片哪家强...
  10. mysql io瓶颈,(续)为什么当磁盘IO成瓶颈之后数据库的性能急剧下降—性能更悲剧篇...
  11. C++多线程编程(3) 异步操作类 std::future std::promise std::async
  12. L2TP 配置实例——Client-Initiated
  13. 第 7 章 Neutron - 080 - 创建第一个 local network(I)
  14. 关于quartus ii 破解失败的问题
  15. 基于Python实现的遗传算法求TSP问题
  16. 计算机表格应用试题及答案,2016年职称计算机考试EXCEL练习试题及答案
  17. 施努卡:密封环ccd检测(密封圈视觉检测的原理 )
  18. execl 多线程 linux,MyExcel 3.7.0 发布,屏蔽多线程处理细节
  19. java——API——ArrayList集合
  20. Java- 求⼀个三位数,该三位数等与其每位数字的阶乘之和

热门文章

  1. 一、uniapp项目(封装异步请求、moment.js时间处理、封装手势滑动组件、下载图片到本地)
  2. LeetCode 545. 二叉树的边界(前序+后序)*
  3. python环境变量的运用_Windows下python环境变量配置
  4. Codeforces Round #702 (Div. 3)解题报告
  5. mysql 逻辑备份导入数据库_mysql逻辑备份(mysql dump的使用)
  6. MYSQL快速导入大量数据
  7. android闹钟测试工具,android开发:AlarmManager闹钟管理器的实例
  8. prototype.js ajax.request,javascript – Prototype和Ajax.Request范围
  9. 用python生成云词汇_用python生成词云wordcloud
  10. pygame render怎么显示中文_Pygame游戏——贪吃蛇(完结)