本篇文章的目的主要是汇总我平时在利用C++编程过程中遇到的各种容易出现错误的知识点,这些知识点大家可能也多多少少有遇到过,我也主要是起到一个带头汇总的目的,帮助更多的C++爱好者提前熟悉,或者巩固这些易错知识点,更加掌握C++语言的特点。以下知识点主要是由我自己实践总结而来,如有错误,还希望有博友能私信我或留言。
数组名代表数组中第一个元素的固定地址
对于一个数组,int a[10],在C++中,数组名代表数组中第一个元素(即序号为0的元素)
的地址
。但要注意,一个数组名a代表一个
固定的地址,或者说是
指针型常量
,因此要改变a的值是不可能的。如
a++; //语法错误,a是指针型常量,不能改变
但是如果定义另外一个指针变量,如int* nptr; 然后将数组名代表的指针型常量赋值给它——nptr = a; 此后由于nptr为指针变量,并不是一个固定的地址值,便可以通过该指针变量的各种运算来访问数组中各元素,如++nptr,即等价于数组元素a[1]的地址。
数组的初始化操作注意点
通常我们在定义一个数组变量时,会在定义的同时对数组进行初始化操作,如
char chVar[10]={0};
此时通过调试发现,数组chVar的每个元素都被初始化成了空字符'\0',通过分析发现是因为我们初始化了
字符数组
chVar的元素取值为数字0,而数字0所对应的ASCII编码即为空字符'\0',类似的如果我们如下初始化字符数组:
char chVar2[10] = {'0'};
此时通过调试可以发现,数组chVar2的
第一项
(即chVar[0])为字符'0'(其对应的ASCII编码为48),其他所有元素默认初始化为空字符'\0'。
类似的,在对整数类型的数组初始化时,例如:
int nVar[10] = {0};
则数组nVar的每个元素都为0,而如果
int nVar[10] = {10};
则数组nVar的第一项为10,其他都被默认初始化为数字0。
总结:
1、
在定义数组的时候一定要习惯性给它们一个初始化的值,未初始化的数字,其值是随机的不可预料的。
2、初始化字符数组为{0}或整数数组为{0}时,则默认将所有数组元素都初始化为0(注意是数字0,在字符数组中,数字0即代表空字符'\0'),否则,初始化为其他值时,只将数组第一项初始化为特定值,其它项仍为默认值。
3、如果想将数组中每个元素都初始化为非默认值,可以用
memset函数
:
char chVar3[10];
memset(chVar3,'a',sizeof(chVar3));
++(自增)和--(自减)运算符、不要混淆其他复合运算符
这两个运算符都是
针对整数
而言的,它们都是一元运算符,用于完成对操作数的加1或者减1的运算。这两个运算符可以分别放在操作数的前面和后面,分别称为前置运算符和后置运算符。但需要特别注意的是,当这两种运算的结果要用来继续运算时,前置运算符和后置运算符的效果是不一样的。例如:
int a = 1; //声明整型变量啊,并给a赋初始值为1
cout<<++a; //利用自增运算符对a加1,输出显示为2,这是a的值也为2
cout<<a++; //利用自增运算符对a加1,输出显示还为2,但是a的值为3
当使用前置运算符时,a首先进行自增运算;使用后置运算符时,先参与其他运算,然后再进行自增运算。
前置运算符的效率高于后置运算符(因为后置运算符其实是通过前置运算符实现的)。
注意不要将自增运算符和其他复合运算符混淆,
复合运算符包括算术运算符与赋值运算符复合,例如+=、-=、*=、/=、%=;位运算符与赋值运算符复合,例如<<=、>>=、&=、^=、|=。复合运算符同样是二元运算符,它们将运算符两边的操作数通过复合运算符中的算术运算符或者位运算符进行运算,然后将结果赋值给左边的操作数,从而实现计算和赋值的复合。
a += 1; //等价于表达式a = a + 1;
a *= b + 1; //等价于表达式a = a * (b + 1);
在自定义函数时,拥有默认值的参数应该位于形式参数表的末尾位置。不能在形式参数表的开始或者中间位置定义拥有默认值的参数
例如:
bool
max(
int
a =
0
,
int
b );
// 错误的形式,默认参数不能在形式参数表的开始位置
bool
max(
int
a,
int
b =
0
);
// 正确的形式,默认参数在形式参数表的末尾位置