function overloading    // 函数重载
返回类型不能构成函数重载的条件
有载的函数在调用时一定要找到一个完全匹配的函数,不然会给出 ambitious 的错误

default arguments
fun(int size, int num = 0);
调用时如果不给出第二个参数 即 fun(100); 那么num使用初始值0
如果是 fun(100, 50); 那么就是按给定的实参的值
如果有缺省的参数,一定要从最右边过来
如果有default arguments 那么应该写在 .h 文件里,而且不能在 .cpp文件里重复写
也就是如果这个函数有 declaration 并且有 default arguments 那么在 definition 里就不能有 default arguments
在软件工程中不建议用 default value, 因为这会造成阅读上的困难

overhead 在计算机里一般是指额外开销
在程序运行的过程中每一个程序都有一个自己独立的堆栈
内联函数在调用时,并没有真的调用而是直接把内联函数的代码插入到调用的地方,但是有保持其函数的所有特性
内联函数不会出现在最终的可执行代码里面
内联函数必须在 declaration 和 definition 中都要出现 inline 关键字
内联函数要比用宏定义好,因为宏定义不能做类型检查
递归函数不能 inline
成员函数如果在类中给出函数体,那么这个函数就是 inline 的
成员函数在类中声明的时候,不加 inline 但是 在class 后的 定义时 写上 inline 也没问题,还是内联的
如果 inline 函数过大,可能在编译的时候不会 inline 

const 定义的常变量仍然是变量,而不是常数
extern 代表的是声明而不是定义

pointer and const
char * const p = "abc";     q是一个const, 这个指针是一个 const, q++是不可以做的,但是所指的内容不是const
const char * q = "abc";     q所指的地方是const,但是q不是, q++是可以做的

person p1("fred", 20);
const person * p = &p1;     // 对象是const,表示不能通过 p 去修改对象,并不是对象就是const
person const * p = &p1;     // 对象是const
person * const p = &p1;     // 指针是const
区别的方法就是 const 在 * 的前面,对象是const; const 在 * 的后面,指针是const
const person * const p = &p1;   // 指针和对象都是const

在成员函数后面加上const, 意思是这个函数不会对任何成员变量左修改,this指针是const的
成员变量不能用作定义数组的大小

 

learning record code:

#include <iostream>
using namespace std;

// int func(int i=1, int j=2);

int func(int i=1, int j=2)
{
    cout << i << " " << j << endl;
    return i + j;
}

int f(int i)
{
    return i * 2;
}

class A{
    private:
        int i;
        const int j;
    public:
        A() : i(0), j(1) {}
        void f() { cout << "f()" << endl; }
        void f() const { cout << "f() const" << endl; }
};

int main()
{
    // int n = 10;
    // int *a = new int[n];
    // char *s1 = "hello world";
    // char s2[] = "hello world";
    // printf("%p\n", s1);
    // printf("%p\n", s2);
    // printf("%p", main);
    // cout << s << endl;
    // s[0] = 'B';
    // cout << s << endl;


    const A a; 
    a.f();


    return 0;
}