-
其实不是完全的C++部分,有些也是在C语言中共有的,但仅作为笔记,加深记忆或者,以免忘记(偶尔备忘录会靠不住嘛)。
- 引用
引用,在数值传递与参数运用上替代了指针,而不涉及对变量存储地址的访问。在不应用变量地址时用更方便。
①
int x;
int & t=x;
//此时,t的数据类型为 int &
//t为x的引用,且只能初始化引用的对象,如果后续中出现t=d,仅表示赋值
②
void swap(int & x,int & y)
{……}
int main()
{
swap(a,b);
}
与用指针相同
void swap(int *x,int *y)
{……}
int main()
{
swap(&a,&b);
}
③引用作为函数的返回值
int n;
int & cal() { return n; }
int main()
{
cal()=30;//对引用赋值,或者对被引用的对象n赋值
}
④常引用
const int & x=r;
x=20;//不能赋值同时报错
r=20;//可以赋值,不会报错
- 内联函数,重载函数,默认参数
内联函数
就是在函数定义时,在最前面(type前)加一个inline,当然,同一个函数只需声明一次。内联函数适用于代码较简单,但会反复执行相同语句时用,作用是能够省去普通函数调用时的额外开销,实际作用是把函数中的代码改写成函数调用处相应的代码。
函数重载
C++允许定义多个相同名字但形参个数和类型不完全相同的函数(注意:不是返回值类型不同),在调用函数时,编译器会根据实参的个数与数据类型调用相应的函数。当然,如果调用时实参存在二义性,编译器会报错。例如:
int max(diuble,double);
int max(int,int);
int main()
{
max(4,4.5);
}
//4和4.5可以看作两个浮点数,也可以看作两个整型数
默认参数
即对函数函数的形参赋值(只能是从右边起连续几个参数),在调用函数时,如果有对应实参,便将该实参值赋给对应形参,若没有,那么形参就赋函数形参列表中给出的值,如:
int max(iint a,int b=-1,int c=-0x3f3f3f){……}
int main()
{
max(2,3);
max(2,3,4);
}
- 常量指针
const定义的常量指针
①可以修改指针指向的地址,也可以修改指向的变量的值,但不可以通过指针修改对应地址存储的值。
②常量指针不可以被赋值给一个非常量的指针,但非常量指针却可以被赋值给常量指针(如果常量指针赋值给非常量指针,那么就可以通过修改非常量指针的值间接通过地址修改常量指针的值),若果非要这么做,做下强制类型转换,如:p1=(int *)p2;
③函数的参数为常量指针,可以保护被指向的变量,避免函数中修改变量值,如果存在修改值的操作,报错。 - new运算符实现动态分配存储空间
动态内存分配,就是分配内存空间可以根据实际需要进行分配。new运算符的返回值是type *也就是指针类型,所以要用指针接收。而分配以后这段内存空间会一直占用,需要收回该部分内存空间,这时就要用到delete,一般用法如:
①
type * p;
p=new type;
delete p;
②
type * p;
p=new type[N]; //N为整型表达式
delete []p;
- (adding)数组作为函数参数
①数组元素作为函数参数
写法上就是在调用函数时,实参写为a[i],即下标为i的这一元素的值传递给函数的形参。与之前函数参数值的传递相同。
②数组名作函数参数
写法上实参仅写为函数名a,此时传递给形参的值是一个地址,即该数组的首地址。而形参则应为一个标明数据类型的数组(可不指定开的范围)。此时,在此函数中可通过形参函数及下标访问实参数组的值。
注意,此时虽然实参形参并没有写为地址的形式,但实质上是地址的传递,所以在函数中可直接对实参数组进行访问,即对数值的操作都会直接改变实参数组的值。(貌似这些在ppt里都有,第45页)
二维数组必须指定第二维的大小,且与实参函数第二维大小相同。原因老师没说,在我看来,是与二维数组内存的分配有关。因为一维数组实质上本就是一个顺序表表,而二维数组同样是一种顺序表,只不过它是一种顺序表的顺序表,即二维数组就是一个数组的数组。虽说二维数组实际上就是一个行列组成的表,但实质上在内存条上存储时还是一维存储的,相当于将每一行的数据并列排位,如第二行数据就存在第一行数据后面。因此,二维数组在用指针访问时,就需要计算第二行与第一行同列之间下标之差。因此,第二维不能省。同理,更高维也一样。
暂时,就这些吧···