#include <stdio.h>
 
class Trace{
public:
  void print(const char* s) { printf("%s\n", s); }
};

int main(int argc, char const *argv[])
{
  Trace t; t.print("begin main()");
  //do something
  t.print("end main()"); return 0;
}

第一段代码:

这里有两个概念需要了解 —— 类 和 类的对象。Trace是一个类, t 是 Trace 类的对象。

类的成员包括 数据 和 方法。

方法属于类,数据属于类对象。—— 理解它。在你的脑海里有具体的图像。你要知道这句话在说什么。

举例说:

Trace 类 可以创建无数个对象,每个对象的方法都是类的方法,方法的入口(函数地址)是类的,不会因为对象不同而不同。

Trace 类 可以创建无数个对象,每个对象的数据都是对象的数据,每个对象的数据的存储空间和其他的对象的数据的存储空间不一样。

class Trace{
public:
  Trace() { noisy = 0; }
  void print(const char* s) { if(noisy) printf("%s\n", s); }
  void on() { noisy = 1; }
  void off() { noisy = 0; }
private:
  int noisy;
};

第二段代码:

Trace t1; t1.noisy = 0;

Trace t2; t2.noisy = 1;

创建了两个Trace类对象, t1 和 t2。

有了类的对象,数据才具体,数据是属于对象的。换句话说对象就是因为被赋予了数据,才从类这个抽象的概念中脱离出来,成了具体的存在。

当类的对象被创建时,同时就有了this指针(这是个非常关键的隐藏属性)。this指针在计算机里的实现方式是对象数据的起始地址。

因为对象数据的存储地址独一无二,所以每个对象的this指针也是独一无二的。

t1.print("Hello");

t2.print("Hello");

其实print方法有两个参数。

void print(const char* s) { printf("%s\n", s); } 相当于 void print(Trace * const this,const char* s) { printf("%s\n", s); }

const 在 * 右边表示 指针地址(this)是常量,const在 * 左边表示 指针(s)指向的内容是常量。

#include <stdio.h>
 
class Trace{
public:
    Trace() { noisy = 0; f = stdout; }
    Trace(FILE* ff) { noisy = 0; f = ff; }
    void print(const char* s) { if(noisy) fprintf(f, "%s\n", s); }
    void on() { noisy = 1; }
    void off() { noisy = 0; }
private:
    int noisy;
    FILE* f;
};
 
int main(int argc, char const *argv[])
{
    Trace t(stderr);
    t.print("begin main()");
    //do something
    t.print("end main()");
    return 0;
}

第三段代码:

修改Trace类,可以任意指定输出文件,而且不影响之前写的程序的正常工作。

C++ 类的特殊方式的使用可以让改进程序变得轻而易举。

C++沉思录笔记 —— 序幕的更多相关文章

  1. 【C++沉思录】句柄2

    1.[C++沉思录]句柄1 存在问题: 句柄为了绑定到Point的对象上,必须定义一个辅助类UPoint,如果要求句柄绑定到Point的子类上,那就存在问题了.2.有没有更简单的办法呢? 句柄使用Po ...

  2. 【C++沉思录】句柄1

    1.在[C++沉思录]代理类中,使用了代理类,存在问题: a.代理复制,每次创建一个副本,这个开销有可能很大 b.有些对象不能轻易创建副本,比如文件2.怎么解决这个问题? 使用引用计数句柄,对动态资源 ...

  3. 生活沉思录 via 哲理小故事(四)

    1.围墙里的墓碑 第一次世界大战期间,驻守意大利某小镇的年轻军官结识了镇上的牧师.虽然军官信仰信教,而牧师是天主教牧师,但两人一见如故. 军官在一次执行任务中身负重伤,弥留之际嘱托牧师无论如何要把自己 ...

  4. 生活沉思录 via 哲理小故事

    本文转载:http://www.cnblogs.com/willick/p/3174803.html 1.小托蒂的悲剧 意大利小男孩托蒂,有一只十分奇怪的眼睛,因为从生理上看,这是一只完全正常的眼睛, ...

  5. 生活沉思录 via 哲理小故事(一)

    1.小托蒂的悲剧 意大利小男孩托蒂,有一只十分奇怪的眼睛,因为从生理上看,这是一只完全正常的眼睛,但却是失明的. 原来,托蒂刚出生时,这只眼睛轻度感染,曾用绷带缠了两个星期.这对常人来说几乎没有人任何 ...

  6. Atitit。 沉思录 与it软件开发管理中的总结 读后感

    Atitit. 沉思录 与it软件开发管理中的总结 读后感 1. <沉思录>,古罗马唯一一位哲学家皇帝马可·奥勒留所著 2 2. 沉思录与it软件开发管理中的总结 2 2.1. 要有自己的 ...

  7. c++沉思录 学习笔记 第五章 代理类

    Vehicle 一个车辆的虚基类 class Vehicle {public: virtual double weight()const = 0; virtual void start() = 0; ...

  8. c++沉思录 学习笔记 第六章 句柄(引用计数指针雏形?)

    一个简单的point坐标类 class Point {public: Point():xval(0),yval(0){} Point(int x,int y):xval(x),yval(y){} in ...

  9. c++学习书籍推荐《C++沉思录》下载

    百度云及其他网盘下载地址:点我 编辑推荐 经典C++图书,应广大读者的强烈要求再版 目录 第0章 序幕第一篇 动机第1章 为什么我用C++第2章 为什么用C++工作第3章 生活在现实世界中 第二篇 类 ...

随机推荐

  1. adb命令整理(持续整理)

    用到过的adb命令都整理下来,省的一直百度,还不一定能找到合适的答案 获得正在运行app的包名 :adb shell dumpsys window | findstr mCurrentFocus 1. ...

  2. (1)安装elastic6.1.3及插件kibana,x-pack,essql,head,bigdesk,cerebro,ik

    1.安装环境及程序版本 操作系统: centos6.7 jdk: 1.8.0_102 elastic: 1.6.3 kibana: 1.6.3 x-pack: 1.6.3 es-sql: 1.6.3 ...

  3. jenkins上下游工程以及空间占用处理

    1.最近项目架构调整,把十几个java项目整合为一个大的项目,这样构建上游工程成功后下游工程会自动构建 解决如下:取消这个勾选即可 2.构建单个项目时,会把所有子工程都打包一次 解决如下:指定构建时的 ...

  4. Hadoop核心组件之HDFS

    HDFS:分布式文件系统 一句话总结 一个文件先被拆分为多个Block块(会有Block-ID:方便读取数据),以及每个Block是有几个副本的形式存储 1个文件会被拆分成多个Block blocks ...

  5. VMware安装出现"已将该虚拟机配置为使用 64 位客户机操作系统"

    1.环境:ThinkPad电脑 系统:win10 64位.VMWare运行虚拟机发现提示无法执行64位操作. 2.解决办法: ⑴ 进入BOIS中 ⑵ 选择Security字段,进入Virtualiza ...

  6. samba + OPENldap 搭建文件共享服务器

    samba + OPENldap 搭建文件共享服务器 这里我使用的是 samba(文件共享服务) v4.9.1 + OPENldap(后端数据库软件) v2.4.44 + smbldap-tools( ...

  7. 推荐几个我近期排查线上http接口偶发415时用到的工具

    导读:近期有一个业务部门的同学反馈说他负责的C工程在小概率情况下SpringMvc会返回415,通过输出的日志可以确定是SpringMvc找不到content-type这个头了,具体为什么找不到了呢? ...

  8. Vue:获取当前定位城市名

    实现思想:通过定位获取到当前所在城市名: 1.在工程目录index.html中引入: <script type="text/javascript" src="htt ...

  9. Mybatis-Plus学习.,简化你的开发,提升开发效率.

    Mybatis-Plus学习以及实践 简介 参考网址 开发环境 开始开发 - 配置pom.xml - Dao/Service/Entity - 基本方法 - 查询类 - 更新类 分页插件 - pom. ...

  10. Docker 本地私有仓库搭建:

    Docker 本地私有仓库搭建: 创建数据卷目录: mkdir /home/sky/registry 用registry镜像启动容器: docker run -d -p 5000:5000 -v /h ...