C++复习笔记(1)

复(su)习(cheng)一下c++。

1. 函数

函数重载:允许用同一函数名定义多个函数,但这些函数必须参数个数不同或类型不同。

函数模版:

(应该是跟java的泛化类似,内容待扩展)

template <typename T>
T min_test(T a, T b) {
    return a<b?a:b;
}

int main() {
    cout<<min_test(1.2, 1.1)<<endl;
    cout<<min_test<int>(2,3)<<endl;
    return 0;
}

大概就是这么个意思。T代表一个位置的数据类型。利用函数模版定义的函数,既可以自动识别类型,也可以指定类型。指定类型应该是可以不完全指定,但是必须按顺序。

2. 数组

字符数组:

char str[10]="book";

这样定义的数组,str的前4个位置分别是book,后面的位置都是。

cout<<strlen(str)<<" "<< sizeof(str)<<endl;

这行命令将输出:4 10。

strlen()是函数,统计到时就结束。sizeof()是运算符,计算数据空间的大小。

3. 指针和引用

总的来说,*和&各有两个意义:

int a=1;
int* b=&a;
int& c=a;
*b=2;

第二行的*代表声明的变量类型为int的指针,&代表取地址。第三行的&代表引用。第四行的*代表解引用。

数组名代表数组第一个元素的地址。

int a[3]={1,2,3};
int* p3=a;
cout<<*p3<<" "<<*(p3+1)<<endl;

指向数组的指针和指针数组:

int (*p1)[4];
int *p2[4];

p1是指向4个元素的数组的指针,p2是一个4个指针的数组。

字符串与指针:

char *s1 = "hello";
cout<<s1<<" "<<*(s1+1)<<endl;
char s2[10]="abc";
cout<<s2<<" "<<*(s2+2)<<endl;

输出结果是:

hello e
abc c

s1和s2基本上可以看成是等价的,形式上来看。

函数指针:

int pa(int x) {
    return x+1;
}

int pb(int x) {
    return x-1;
}

int main() {
    int (*fp) (int x);
    fp = pa;
    cout<<fp(5)<<endl;
    fp = &pb;
    cout<<fp(5)<<endl;

    return 0;
}

声明就是跟fp那种方法生命。在赋值的时候,注意函数名其实就已经表示了该函数的地址,所以加不加取地址符都一样。

常引用不能通过引用对目标值进行修改。

4. 结构体,共用体,枚举

共用体的不同数据类型共用一段内存空间。

结构体和共用体占用的内存计算(没搞懂,待补充)

5. 预处理

宏定义:

简单宏定义中,替换部分是表达式的时候,要加括号。带参数的表达式也要各种加括号。

复合语句的宏在预处理时会被展开,所以可以用do {} while(0)来把复合语句变成单一语句。

条件编译中,定义的宏如果只作为条件,可以没有内容。

(大概先这样,慢慢补充)

原文地址:https://www.cnblogs.com/wangzhao765/p/9107980.html