c++复习
命名规则
- 变量名只能是字母和数字或者下划线组成。
- 第一个字母必须是字母或者下划线开头,数字不能开头。
- 不能使用C++关键字来命名变量,以免冲突。
- 变量名区分大小写。
因此,这些变量名都是合法的:Bool fabs _member cin(cin当然是合法的)。
这些是不合法的extern(这是关键字)$dallor(不能有$) m-mr(不能有减号)。
二维数组
理解
int a[10][20]的含义是 a 是一个有10个元素的数组,每个元素都是一个一维数组(有20个元素的数组)
int a[10][20][30]的含义是 a 是一个有10个元素的数组,每个元素都是一个二维数组
方法就是从内往外看(从左往右看),这样就好理解了。
另外,对二维数组,第一维表示行,第二维表示列
// 2 行,3 列
int a2[][3] = { {1, 2, 3},
{4, 5, 6} };
细节
1、无论数组是多少维的,初始化时仅第一维的大小可以省略不写。
2、b[i]等价于*(b + i),分析的时候这两可以直接转换,同样地&b[i]也等价于b + i
3、行指针和列指针:
相关文章
c++的二维数组只有第一维可省,java的二维数组第二维可省而第一维不能省:
java和c定义二维数组下标省略问题-CSDN
java数组的维数问题
c++类型声明规则
指针常量和常量指针
按上面的方法就很容易看懂。
https://www.cnblogs.com/icbm/p/16210493.html
指针的引用
int a = 10;
int* p = &a; // p指针指向a
int*& rp = p; // rp时p指针的引用,rp就是p指针的别名,同样指向a
cout << *rp << endl; // 10
int* &也是一种引用,遵守所有引用的规则,比如必须初始化
int& *是错误的!
引用
引用的注意事项:
- 引用必须绑定对象
- 引用一般不能绑定常量
- 引用是终生绑定变量不会被修改(不会再绑定其他变量)
- 不要返回局部变量的引用
- 可以有引用指向一个指针变量
- 数组的引用一定要表明数组的大小
- 引用的本质是指针常量:
int a = 5; int& ra = a;等价于int* const ra = &a;
具体看这篇:https://www.cnblogs.com/icbm/p/16165657.html
函数指针
看几个例子练习一下:
1、普通的函数指针:int (*f_ptr)();,记住长这样的就是函数指针:(*)()
2、f_ptr是一个函数指针,指向一个函数,这个函数的返回值是函数指针:void (*(*f_ptr)())();
3、定义一个长度为10的数组,数组中的元素类型是函数指针:void (*f_ptr[10])();,这样的就是函数指针数组:(*[ ])(),这是因为数组声明时,[ ]必须紧跟变量名
4、fp是一个函数,函数的返回值是一个指针,这个指针指向一个大小为10的数组,数组中的每一个元素都是一个函数指针:int (*(*fp())[10])();
有道例题:

答案是 D,不能中括号后又跟小括号,这种写法不对,应该这样写:float(*pf[3])()
具体看这个:https://www.cnblogs.com/icbm/p/16120191.html
行指针和列指针
sizeof和strlen和转义字符
这篇虽然很乱但一定要看完:https://www.cnblogs.com/icbm/p/16211424.html
c++里的各种数据类型及转换
- 数据类型及存储的方式(数据都是按补码存的,但是读取时,正数unsigned的源码和补码一致,所以最高位/符号位的1会被计算,而负数的源码和补码不一致,源码的最高位1只是负数的标志,不会被计算)
- 运算时的自动类型转换(记住那张转换的图)
- 赋值时的自动类型转换
- 强制类型转换
- 父子关系转换
看这篇:从double(5/2)的陷阱到unsigned转换
运算符
运算符的优先级
详解优先级和结合性的含义,还有maximum munch rule:https://www.cnblogs.com/icbm/p/16141233.html
运算符的返回值及复杂运算
运算符的返回值:https://www.cnblogs.com/icbm/p/16141418.html
(++i + ++i = 6)未定义行为:https://www.cnblogs.com/icbm/p/16218560.html
c++格式化
c++输入输出
起别名的方法
速记:
#define ll long long
typedef struct Book {
}Book;
Book obj;
typedef char AUTHOR[10]; //给char[10]起别名AUTHOR
AUTHOR author; //等同:char author[10];
using size_t = unsigned int;
详细的看这里:https://www.cnblogs.com/icbm/p/16204297.html
using指令和namespace
using的作用
1、声明命名空间:https://www.cnblogs.com/icbm/p/16119998.html
2、代替typedef:https://www.cnblogs.com/icbm/p/16120012.html
什么是命名空间
using namespace A;详解:https://www.cnblogs.com/icbm/p/16107428.html
函数重定义
这里直接上例题(2021年):

根据实际实验的结果,当然首先2和3是重定义了的,因为const int和int const等价,还有就是1和4重定义了,这意味着参数非const和const会产生重定义:
// 以下情况都会导致重定义错误!
// 变量p和常量p
void f(int p) {}
void f(const int p) {}
void f(int p) {}
void f(int const p) {}
// 指针和常量指针
void f(int* p) {}
void f(int* const p) {}
// 参数名不同当然也不行
void f(int* p) {}
void f(const int* m) {}
函数重载的条件:
- 函数名相同
- 参数不同(参数类型不同,个数不同,顺序不同)
注意到参数名字不同当然不算重载,会发生重定义错误,常量类型和变量类型也不算重载,还有就是只有返回值类型不同也不能算重载,下面两个函数就发生了重定义错误:
int fov(int a);
void fov(int a);
重载时返回值类型可以相同也可以不同,总之就是重载的条件跟返回值类型无关

浙公网安备 33010602011771号