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++类型声明规则

初中生也能看懂的C/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) {}

函数重载的条件:

  1. 函数名相同
  2. 参数不同(参数类型不同,个数不同,顺序不同)

注意到参数名字不同当然不算重载,会发生重定义错误,常量类型和变量类型也不算重载,还有就是只有返回值类型不同也不能算重载,下面两个函数就发生了重定义错误:

int fov(int a);
void fov(int a);

重载时返回值类型可以相同也可以不同,总之就是重载的条件跟返回值类型无关

posted @ 2023-01-23 18:37  dunhedunhe  阅读(28)  评论(0)    收藏  举报