c++
1、 位移操作
<< 高位弃,低位补0,符号位被移除表示溢出
>> 低位弃,高位(无符号数补0)(有符号数,负数补1,正数补0)
2、 类型转换
隐式类型转换 :低–>高
显示类型转换:
int (z)
(int) z
static_cast <
i
n
t
int
int> (z)
3、 sizeof
sizeof(类型名)或sizeof(表达式)
sizeof(short) = 2
4、 伪随机数
头文件
<
c
s
t
d
l
i
b
>
<cstdlib>
<cstdlib>
srand(0); //伪随机数种子,产生不同的随机数序列
M = rand() % n; // 产生 0~ n-1的随机数
5、 操作符
%: 操作数为整数
, 表达式,先计算左边再计算右边,返回最右边值
/: 操作数为整数,结果取整;有一操作数为浮点数则结果取浮点数
关系运算符 < > <= >= 优先级高于 == !=
逻辑运算符 返回bool, && || 短路性质(左为真/假,不计算右了)
= 优先级高于,条件表达式优先级高于 =
条件表达式 : 表达式1?表达式2:表达式3 (2和3类型可不同,返回2、3中类型较高者)
6、 位运算
&: 将某位至0: a = a & 1111110
取a最低几位: c = a & 00000011
|: 将低8位至为1: a = a | 0xff
^: 不同为1, 相同为0
~: 取反
7、 别名
typedef 已有类型 新名字 (C)
using 新名 = 已有名 (C++)
8、 枚举类型
enum Weekday = {SUN, MON, TUE, WED, THU, FRI, SAT}(默认从0开始)
enum Weekday = {SUN = 7, MON = 1, TUE, WED} (TUE = 2, WED = 3)
定义一个枚举值:
- Weekday day;
- enum Weekday day = SUN; (enum 可有可无,day可初始化)
- day = Weekday(1); (整数需要强制转换类型)
9、c++11枚举类
enum class Type {}; // 类型为int
enum class Type:char{}; // 类型为char
比枚举类型的优点:
- 强作用域 Type::General 避免重名
- 禁止隐含将其转换为整数
- 可以指定底层类型
10、 函数
- 函数被 调用时才分配形参存储单元
- 定义引用必须初始化且不能更改
- 默认值参数放到最右边,形实结合是从左到右;声明时指定形参默认值,定义时不能再写。
- 函数不能将非静态的局部地址返回
11、 内联函数
- 内联函数不能有循环和switch语句
- 内联成员函数,在类内实现或者在类内声明带inline的函数原型,在类外实现
12、 结构体 联合体
- 结构体不声明成员属性,默认是公有,类相反
- 联合体成员共用存储空间
union Mark{ … };
无名联合体 union { int i; float f; };
i =2; f = 9; // i就没了
13、 类
- 访问属性(友元函数都能访问)
private 成员只能被本类成员访问
protected 成员可以被本类及其派生类成员访问,类外不可访问
public 成员可以被所有类成员以及类对象访问 - 继承
private继承,基类的所有成员变成子类的private成员,只能在本类成员中使用
protected继承,基类public和protected成员变成子类protected成员,private成员属性不变
public继承,基类所有成员属性不变
13.1、构造函数
- 可内联,可重载,不可为虚函数
- 默认构造函数:
Clock();
Clock(int newH= 0 , int newM = 0, int newS = 0);
不能同时出现 - 没有初始值,则为垃圾数据
- 自己定义了有参构造函数,系统就不会生成默认构造函数了
若, Clock c; // 报错
c++11: Clock() = default; // 让编译器还生成默认构造函数
13.2、复制构造函数
声明: 类名 (const 类名& 本类对象);
三种调用情况:
- 赋值
- 形实结合
- 函数返回类对象
有指针时不能使用默认的浅层构造函数
c++11: Point(const Point&p) = delete; // 指示编译器不要默认生成
例: Line line(p1, p2); // 4次 Point copy
Line line2(line); // 一次Line copy中有两次 Point copy
13.3、类的组合
定义: 类的成员是另一类对象
类名::类名(对象成员参数…, 本类成员参数…):对象1(参),对象2(参)…{}
次序:按照成员在类中声明的顺序,不按照初始化列表顺序
13.4、类间的相互引用
类声明之前不能声明该类对象,不能在内联中使用该类对象
class B;
class A{
public:
void f(B b);
};
class B{
public:
void g(A a);
};
// 正确
class B;
class A{
public:
B b;
};
class B{
public:
A a;
};
// 错误,B占多少字节都不知道
13.5、类的友元
声明时加friend关键字,定义时不写
13.6、继承。
- 构造和析构函数不被继承,c++11可以用using继承构造
- 公有派生可转换为基类,但对象只能访问基类继承而来的函数。
- 不要重写继承而来的非虚函数
- 派生类的构造函数的顺序:
先构造父类:若是多继承,按继承时声明的顺序自左向右构造;
再构造组合类:与初始化列表顺序无关,按类内定义的顺序构造;
最后构造派生类成员。
14、常类型(const)
- 常对象:定义时初始化且不能被更新
- 常成员函数:处理常对象,不改变成员状态
- 声明和定义时都带const
- const是区分重载的因素
- 常对象和普通函数都可调用常函数,常对象只能调用常函数
- 常成员变量只能在初始化列表中初始化
15、多态
- 静态多态,重载,编译阶段
形参类型不同或个数不同,和返回值类型无关,函数功能要相同
16、作用域
- #include" .h" //从自己文件目录中找,再从系统目录找
- #include<> // 从系统目录找
- 文件作用域的变量为外部变量,只要在使用前声明
- namespace{} // 只能在当前文件中使用
- 静态生存周期:文件作用域或static修饰的变量
17、静态类型
- 类的所有对象共享,类内声明类外初始化
- 静态函数处理静态数据
- 类外定义时不加static关键字
- Point::showCount(); a.showCount();
- 不能用非静态变量去初始化静态指针
- 只有整数0可以赋给指针,可以和指针比较,表示空指针;c++11 nullptr表示空指针
- 静态成员函数没有this指针
18、数组
- 只对数组部分元素初始化,剩余元素为0
- int a[10], *p;
p = &a[0] / p = a;
a[i] = *(p+i) = p[i] = *(a+i) - 多维数组
int(p)[9][8] = new int [7][9][8]
(((p+i)+j)+k) = p[i][j][k]
19、文件读写
getline(cin, s2); // 读入整行,包括空格,换行结束
getline(cin, s2, ‘,’) // ,结束
cin>>c; // 遇到空格结束
20、C++11
- CONSTEXPR函数
constexpr int getSize() {return 20;} //编译前可计算,程序中可用来赋值 - 基于范围的for循环
for(int* p = array; p < array+sizeof(array)/sizeof(int);++p)
⇒ for(int & e: array) // 每个元素是e - 智能指针:
unique_ptr: 不允许多指针共享资源,可以用move函数转移指针,转移后就失效了
shared_ptr: 多个指针可指向共同的内存单元
weak_ptr: 可复制shared_ptr指向的单元,但其构造或释放对资源不产生影响 - 移动构造
class IntNum {
IntNum(int x = 0):p(new int(x)){} // 构造函数
IntNum(const IntNum& n):p(new int(*n.p)){} // 复制构造
IntNum(IntNum&& n):p(n.p){ n.p = nullptr; } // 移动构造
private:
int* p;
};