C++零碎知识记录

**一、**else总是与尽可能近的if配对

二、

switch语句的使用:

1
2
3
4
5
6
7
8
switch(表达式){
case 常量1 :
执行的语句;
break;
case 常量2 :
执行的语句;
break;
}

三、各种运算符的优先级

C语言的运算符包括单目运算符、双目运算符、三目运算符,优先级如下:
**第1优先级:**各种括括号,如()、[]等、成员运算符 . ;
**第2优先级:**所有单目运算符,如++、–、!、~等;
**第3优先级(算数运算符):*乘法运算符、除法运算符/、求余运算符%;
**第4优先级(算数运算符):**加法运算符+、减法运算符-;
**第5优先级(移位运算符):**移位运算符<<、>>;
**第6优先级(条件运算符):**大于运算符>、大于等于运算符>=、小于运算符<、小于等于运算符<=;
**第7优先级(条件运算符):**等于运算符==、不等于运算符!=
**第8优先级(按位运算符):**按位与运算符&
**第9优先级(按位运算符):**按位异或运算符^
**第10优先级(按位运算符):**按位或运算符|
**第11优先级(逻辑与运算符):**逻辑与运算符&&
**第12优先级:**逻辑与运算符:逻辑或运算符||

第13优先级:三目条件运算符 ?

**第14优先级:**各种赋值运算符,如=、+=、-=、=、/= 等

第15优先级:逗号运算,

四、

数组的起始地址是一个常量指针,不可对其进行自加自减操作

五、

继承时,父类的所有属性都会继承到子类中,只是私有属性被编译器隐藏了,无法看到也无法访问,表现为“没有继承”

六、

问号运算符——唯一一个三目运算符

表达式一 ?表达式二 :表达式三

如果表达式1成立,则输出表达式2的值,否则输出表达式3的值。

1
2
3
int a=1,b=2,c=0;
c=(a<b)?100:2;
//运行结果:c被赋值为100

七、

逗号运算符:

表达式1,表达式2

求解过程:先求表达式1,再求表达式2,最后结果为表达式2,即:从左往右求结果,最后结果为最右边的表达式

示例:

1
2
3
int x,a;
x=(a=3,6*3);
//x=18

注意:逗号运算符的运算优先级是最低的

1
2
x=a=3,6*a;
//x=3

八、

指向同一数组的两个指针相减,其结果为两个指针所指向的元素下标之差

九、

字符数组不可以用“=”赋值

十、

构造函数和析构函数都不能被继承

基类的友元对从该基类派生的类型没有特殊访问权限,即友元关系不能被继承

**十一、 ** 赋值兼容规则

  1. 派生类的对象可以赋值给基类,基类的对象不可以赋值给派生类对象
  2. 基类的指针可以指向派生类,派生类的指针不可以指向基类
  3. 基类的引用可以作为派生类的别名,反之则不行

发生赋值兼容后,子类对象只能被作为父类对象使用,即只能使用从父类继承而来的成员。

十二、构造和析构的顺序

  • 当创建子类时,先执行父类的构造函数,再执行子类的构造函数

​ 当析构子类时,先执行子类的析构函数,再执行父类的析构函数

  • 当一个类作为对象成员时:

    构造时,先调用对象成员的构造函数,再调用包含对象成员的类的构造函数

    析构时,先调用包含对象成员的类的析构函数,再调用对象成员的析构函数

十三、

构造函数不能被说明为虚函数

十四、

常函数:

  • 成员函数后加const,变成常函数

    示例:

    1
    void show() const{}
  • 常函数内不可以修改成员属性

  • 成员属性加上关键字 mutable 后,在常函数中可以修改

    1
    mutable int a;

常对象:

  • 声明对象前加const称为常对象
  • 常对象只能调用常函数

十五、

面向对象三大特性:封装,继承,多态

十六、

在vector中,插入和删除操作会使当前迭代器失效。因为动态管理内存是重新分配空间。