C++学习笔记(1)

时间:2022-12-25 22:38:35

C++


通过对象调用虚函数时,C++采用的是静态联编;
静态联编/动态联编
通过对象名调用虚函数,在编译阶段就能确定调用哪一类的虚函数,属于静态联编;
通过基类指针调用虚函数,在编译阶段无法从语句本身确定调用哪一个类的虚函数,只有在运行时,指针指向某一类对象后,才能确定调用的是哪个类的虚函数,属于动态联编;


delete和delete[] 的区别。delete和delete[]都能释放指针所指向的内存区域。但delete只会调用一次析构函数,而delete[]还会调用后续所有对象的析构函数。当数据类型为基本数据类型时,用delete和delete[]都可以,因为基本数据类型没有析构函数


数组指针/指针数组:
数组指针:int (*p)[N];
p是一个指针,指向一个整型的一维数组,一维数组的长度为N,执行p+1时,p要跨过n个整型数据的长度。
如要将二维数组赋给一指针,应这样赋值:
int a[3][4];
int (*p)[4]; //该语句是定义一个数组指针,指向含4个元素的一维数组。
p=a; //将该二维数组的首地址赋给p,也就是a[0]或&a[0][0]
p++; //该语句执行过后,也就是p=p+1;p跨过行a[0][]指向了行a[1][]
指针数组:int *p[N]
p[N]组成数组,再由int * 说明为整型指针,说明有N个指针类型的数组元素,执行p+1时,则p指向下一个数组元素,p=a是错误的赋值,p是不可知的表示,存在p[0],p[1],p[2]…p[N-1],它们分别是指针变量可以用来存放变量地址
如要将二维数组赋给一指针数组:
int *p[3];
int a[3][4];
p++; //该语句表示p数组指向下一个数组元素。注:此数组每一个元素都是一个指针
for(i=0;i<3;i++)
p[i]=a[i]
这里int *p[3] 表示一个一维数组内存放着三个指针变量,分别是p[0]、p[1]、p[2]
所以要分别赋值。

注意:优先级:()>[]>*
出处:http://www.cnblogs.com/hongcha717/archive/2010/10/24/1859780.html


常量指针/指针常量
常量指针:int *const pa
“常量指针”即指针本身的值是常量,但“能靠解引用改变它指向的对象的值”,如下:
pa=&d; // 不可行(d是已经声明过的整型)
*pa =d; // 可行(d是已经声明过的整型)
常量指针是const常量,所以它必须在第一次声明时就初始化,不过它的初始值缩小为只能是变量(的地址),因为只有变量才能确保以后能靠解引用而改变它指向的对象的值。这使得常量指针不象一般的const常量,用变量或常量初始化都可以。
也就是说,常量指针反而总是指向变量的。

指针常量:int const *pa、const int *pa
两种表达方式等价,指向常量的指针有时候会指向常量,所以它具有这个性质:“不能靠解引用改变它指向的对象的值”,以此保护它所指向的常量的常量性:
*pa =d; // 不可行(d是已经声明过的整型)

但指针本身的值是可变的:
pa=& d; // 可行(d是已经声明过的整型)

而且指向常量的指针有时候也会指向变量,如下:
int t,u;
const int *pa;
pa =&t; //可行,指向变量t
pa =&u; //也可行,指向变量u

我们可以把它理解成:“为了指向常量而发明的指针”,这样比较贴切。