1. 字符

1.1 字符类型库:头文件"cctype"

在头文件<cctype>(相当于 C 语言中的<ctype.h>),包含了一下字符处理函数:

FUNCTIONEXAMPLE
int isalpha(int ch);//如果 ch 是字母,返回 1,否则 0
int isdigit(int ch);//如果 ch 是数字,返回 1,否则 0
int isalnum(int ch);//如果 ch 是字母或数字,返回 1,否则 0
int isxdigit(int ch);//如果 ch 是十六进制数字[0-9A-Fa-f],返回 1
int...

操作符重载就是指操作符会对不同类型的操作数表现出不同的行为。例如:(a) 按位左移操作符’«‘在操作流对象的时候就变成了插入操作;(b) *操作符操作于两个数字的时候就是乘法操作,而作用于 地址的时候就是间接寻址操作。C++允许你再用户端扩展操作符重载。

操作符重载就像函数重载那样,同一个函数名可以因为参数不同而同时存在很多版本。

1. string 类中重载的操作符

C++的"string"类中重载了以下操作符来作用于"string"对象:

  • 字符串比较操作(=,!=,>,<,>=,<=):例如,使用str1 == str2来比较...

1. 简介

我们对传递数值或变量给函数都很熟悉,除了传递变量,我们还能传递类型给模板。传递类型就是大家所熟知的泛型编程,因为 我们可以用泛型编写程序,而用特定的类型调用。

泛型编程的目的是为了编写的程序不依赖于数据类型。在 C 语言中,所有的代码都需要绑定到确定的数据类型,这样写的代码只能对特定的数据类型起作用。 而模板可以让我们实现泛型编程。你可以将类型作为参数来构建模板函数和类模板。当你的算法需要作用于多种数据类型的时候,模板就显得及其有用了。

C++的标准模板库(STL)提供了一些常用的容器类模板的实现,例如vector,可以用来存放所有类型的元素。

2. 示例:STL 中的 vector 类模板

C/C++中的内置数组有...

1. 继承

1.1 术语

超类(基类)和子类(派生类):在面向对象程序设计中,我们通常使用继承来避免代码冗余。在 C++中,继承的语法规则如下:

class SubclassName : inheritance-access-specifier SuperclassName {
	......
};

子类继承了父类所有的成员,子类也可以定义自己的构造器和成员。

访问标识符:C++支持三种访问标识符:privatepublicprotected。一个类的 public 成员变量、成员函数,可以通过类的成员函数、类的实例变量进行访问。 一个类的 protected 成员变量、成员函数,无法通过类的实例变量进行访问。但是可以通过类...

1. 示例:使用引用的"Time"类

回到之前版本的"Time"类,假设我们想增加链式操作,例如t.nextSecond().nextSecond().print(),我们就需要让nextSecond()返回this的一个引用。

Time.h

class Time {
private:
	......
public:
	Time &nextSecond(); // Return a reference to "this" instance
	......
}

在函数原型中,我们申明了一个nextSecond()的成员函数,返回Time对象的引用。返回的引用可以用来继续调用成员函数。...

指针,引用和动态分配内存是 C/C++语言中最强大的特性,这些特性使得程序员能够直接操作计算机中非常珍贵的记忆体资源,进而对内存进行最大性能和高效的使用。 然而指针也是一把双刃剑,它也是 C/C++编程语言中最复杂和最难的特性。

指针之所以这么强大,是因为它允许你通过地址来访问和操作对应记忆体中存储的内容。但是指针也很难被驾驭,使用好的话确实能够大大提升性能,而用的 不好的话,也会导致很多问题,例如著名的内存泄漏和缓冲区溢出,这些 bug 会致使系统发生紊乱。一些新的编程语言(例如 Java 和 C#),将指针从它的语法 中去掉,通过提供自动内存管理的方式来避免使用指针导致的许多问题。

虽然你在编写 C/C++代码的时候可以不使用指...

1. 为什么要使用 OOP?

假如你想组装一台电脑,你会去硬件商店购买主板、处理器、内存条、硬盘、机箱、电源,然后将它们组装在一起,然后打开电源,电脑就能运行。 你不用考虑主板是 4 重板还是 6 重板,硬盘是什么尺寸,内存是哪里生产的诸如此类的问题。你只需要将这些硬件单元组合在一起,就能期待电脑能够运行。 当然,你需要保证你有正确的接口,比如,如果你的主板只支持 IDE 接口,而你需要购买一个 IDE 的硬盘而不是 SCSI 硬盘,又例如你需要选择一个合适速率的 内存。即便如此,将硬件组件组装成一台机器也没有任何难度。

同样的,一辆车也是由多个部分组装起来的,例如底盘、车门、引擎、车轮、刹车和传动装置。这些组件都是可复用的。比如...

原文地址http://nikic.github.io/2017/04/14/PHP-7-Virtual-machine.html

写这篇文章的目的是基于 php7,阐述 Zend Virtual Machine 的内部实现。这不是一篇综合描述,我将尽可能地覆盖到所有重要的部分和细节。

本文的描述对象是 php7.2 版本,但是几乎所有的特性都已经应用在了 php7.0/7.1 中了。然而,它们同 php5.x 系列 VM 的不同之处同样也很重要,我会很有耐心的同步描述。

这篇文章主要是从指令的角度来阐述,只有在末尾花了少量篇幅描述了 C 语言实现 VM 的细节。但是在文章开始之前,我想先提供一些实现 VM 的主要代码文件:...

原文地址http://blog.jpauli.tech/2017/01/12/threads-and-php.html

前言

PHP 和线程,单凭这简短的几个字,就足以写一本书。像往常一样,我们不会这么做,但是会给出一定程度上跟这个话题相关的信息与细节。让我们从一些人在谈论这个话题时通常感到的困惑开始,PHP 不是一种线程语言, PHP 的内核没有使用线程,而且 PHP 天生也不允许用户层代码通过任何方式使用多线程作为并发机制。

因此 PHP 跟其他一些技术有很大的区别,例如 Java。Java 不仅自身使用了大量的线程,它还允许用户通过编程来是用线程。然而,PHP 不适用线程是有它的原因的。

PHP 内核没有使用线程,主要是为了...

在阅读优秀的 c 语言开源程式的时候,我们经常会看到各种复杂的声明,顿时会让我们怀疑人生,怀疑自己是否真的看得懂 c 语言。然而冷静三秒钟,透过现象看本质,发现牛人写的代码并不是“天书”, 也是很好懂的,关键是要冷静和耐心去阅读。

从“C Traps and Pitfalls”中的一个例子说起

(*(void(*)())0)()

下面我们来一步步分析:

我们知道变量的声明方式为:

int a;

函数的声明方式为:

int fn();

指针的声明方式为:

int *a = 10;

函数指针的声明方式为:

int (*fn)(); //fn 是一个指向返回int型的函数的指针

函数指针的调用方式:...