C++ 基础知识

(项目向),作为 OI 一些不常用的东西的补充。

流操作(iomanip.h)

具体操作见书

函数

函数参数初始化

1
2
3
4
int example(int x, int y = 7, int z = 10) {
return x + y + z;
}
example(2);//调用

以下写法是错误的,只能将初始化的参数放在右边

1
2
3
int error(int x, int y = 10, int z) {
return x + y + z;
}

static变量

方式:

1
static int a;

定义的a不会因为退出函数而消失,而是在整个程序完成后才消失

指针

定义

1
int *a, *b;//定义了两个int类型指针

指针赋值(地址)

1
2
int i = 10;
a = &i;//&i取地址

指针对应值

1
int value = *a;

常量指针

不能改变内存指向:

1
int *const p = &a;

不能改变值:

1
int const *p = &a;

不能改变内存指向、也不能改变值:

1
int const *const p = &a;

指针函数

1
2
3
4
5
6
int max(int a, int b) {return a > b ? a : b;}
int min(int a, int b) {return a > b ? b : a;}
int (*func)(int, int);
func = &max; cout << func(3, 6) << endl;
func = &min; cout << func(3, 6) << endl;

引用

右值引用 (C++11)

1
2
3
int get() {int a = 9; return a;}
int &&k = get() + 4;
//int &k = get() + 4;是错误的

Struct和枚举类型

枚举类型

1
enum dog{Taidi, Jinmao, Hashiqi};

并且默认

1
enum dog{Taidi=0, Jinmao=1, Hashiqi=2};

可以人为修改,只修改部分则后面按顺序单调增长

类型推导 (C++11)

1
2
Type k = sv;
decltype(k) p = sv;

union共用体

1
2
3
4
5
6
7
8
9
10
union {
int i;
char ch;
double db;
}u;
union mn{
int i;
char ch;
double db;
}u;

相当于只有一个值可用,就是最后赋值的值,不是三个值的struct

面向对象

类和对象

构造函数

1
2
3
4
5
6
7
8
9
class a {
int x, y;
a(){//构造函数
x = 1, y = 0;
}
a(int x, int y){//重载构造函数
this->x = x, this->y = y;
}
};

析构函数

析构函数:没有返回值没有参数 销毁时调用

1
2
3
4
5
6
7
8
9
10
11
12
class a {
int x, y;
a(){//构造函数
x = 1, y = 0;
}
a(int x, int y){//重载构造函数
this->x = x, this->y = y;
}
~a() {//析构函数 没有返回值没有参数 销毁时调用
x = 888, y = 888;
}
};

访问

public:公开
private:私有,仅本类可用
protected:私有,派生类可用

友元

1
2
3
4
5
6
7
8
9
10
class b {
int u, v;
};
int whw(a hh) {return hh.x + hh.y;}
class a {
private:
int x, y;
friend class b;//友元类
friend int whw(a hh);//友元函数
};

继承

定义

1
2
3
4
5
6
7
8
class a {
protected:
int x, y;
};
class b : public a {};//b是a的派生类
//public:基类是什么就是什么
//private:不能访问基类private
//protected:所有基类的public,protected都继承为protected

构造/析构函数访问顺序

构造函数:由父类到子类
析构函数:由子类到父类

父类构造函数有参数情况

1
2
3
4
5
6
7
8
9
class a {
private:
int x, y;
protected:
a(int u, int v) {x = u, y = v;}
};
class b : public a {
b(int u, int v) : a(u, v) {}//显示调用父类构造函数
};
------ 本文结束 ------