在 c++ 中,一个 Macro 就是一段代码的聚合。使用这个 macro 名称就代表着对应的代码段。

有两种常见的 macro:object 形式,function 形式。可以定义任意有效的字符作为 macro 名称,甚至是 c 关键词。

阅读全文


有如下代码:

int main()
{
    char *s;
    s = "hello";

    cout << *s << endl;
    cout << s << endl;

    return 0;
}

//OUTPUT:
//h
//hello

首先定义了一个指针,然后给指针赋值为一个字符串。看起来以上写法有错误,s 指针是一个地址,为什么给它赋值一个字符串?

因为在 c++ 中字符串类似于我们提到的数组,使用数组名就表示第一个数组元素的地址。例如:

int main()
{
    int arr[] = {1, 3};
    int *p = arr;

    cout << *p << endl;
    cout << *(p+1) << endl;

    return 0;
}

//OUTPUT:
//1
//3

同样在字符串中,s = "hello" 表示将首字母 h 的地址赋给指针。


关于 function 的基础教程参考:C++ 入门教程之四 -- Functions

当 function 的传入参数为数组时,如果我们想要得到数组元素个数可能会这样写:

void testFunc(int arr[]) {
    int count = sizeof(arr)/sizeof(arr[0]);
}

int main()
{
    int arr[] = {1, 3, 6, 8};
    cout << testFunc(arr) << endl;

    return 0;
}

sizeof function 可以返回数据占用内存空间的大小。所以用整个 arr 大小除以第一个元素大小可以得到数组元素个数。

但是测试会发现以上得到的 count 值并不是 arr 数组元素个数 4 而是 2。这是因为当 function 传入数组数据时,会自动将其转换为 pointer 指针类型。这时候使用 sizeof() 得到的不是 arr 数据所在地址的内存大小,而是这个指向 arr 数组的指针所占用内存大小。

阅读全文



inheritance 继承

inheritance 继承是面向对象编程最重要的概念之一。继承允许我们基于已有的 class 创建新的 class。这能够极大的方便我们创建应用程序。

一个 class 的属性被其他 class 继承,我们称这个 class 叫做 base class。一个从 base class 继承属性的 class 我们称其为 derived class。一个 derived class 获得所有 base class 的功能,且可以有自己独有的功能:
1.png

阅读全文