C++的指针学习

来源:互联网 发布:查英语单词的软件 编辑:程序博客网 时间:2024/06/06 03:49

C++交流群:197321069

一,指针的特性

(1)指针可以指向一个对象

(2)指针可以指向一个消失的对象(It can point to the location just immediately past the end of an object);//这句话翻译的

(3) 指针可以是一个空的,这说明它不指任何一个对象

(4)指针可以指向一个无效的值;这个值是以上三种情况之外的。

二,nullptr是一个常量,它可以转化为任何指针类型,NULL是一个预处理符号,它表示的是0

注意:所有的指针必须要初始化。

三,指针和引用

引用不是一个对象,一个引用只能属于一个固定的地址,而指针可以指向不同的地址。

四,在所有的条伯判断中,即在if(*ptr)的条件中,如果指针指向的值不是0,也可以是对象 ,即为真(true),如果为零即false

五,指针的比较

如果两个指针指向的地址一向,则两个指针相等,如果两个指针都为null,这两个指针也相等。

六,void* point;它可以指针任何对象的地址,但是这个对象地址的类型是不知道的。

七,C++必须定义复制构造函数的情况

先看一段代码:

class CMessage{private:char* pmessage;public:void ShowIt() const{cout <<endl <<pmessage;}CMessage(const char* text = "Defaut message"){pmessage = new char[strlen(test) +  1];strcpy_s(pmessage,strlen(text) + 1,text);}~CMessage(){delete[] pmessage;//这里是数组,所以在带[]}};int main(){CMessage motto1("Radiation fades your genes.");CMessage motto2(motto1);//这里会有问题}

在上面的代码中,会出现一个问题,在main函数中,CMessage motto2(motto1) ,这段代码会调用类的默认复制构造函数,将对象motto1的指针成员存储的地址复制到motto2中,因为默认复制构造函数实现的复制过程只是将原来对象的数据成员中存储的复制到新对象中,因此,这两个对象将共享仅有的一个文本字符串。因此,在任何一个对象中对字符串进行的修改,也会修改另一个对象,因为两个对象共享相同的字符中,如果销毁motto1,那么motto2的指针将指向已经被释放,现在可能用于其他对象的内存区域,因此肯定会发生混乱。当然,如果删除motto2,也会出现相同的问题。

因此,为了解决这个问题,只要提供一个复制构造函数来代替默认版本:

CMessage(const CMessage& aMess){size_t len = strlen(aMess.pmessage) + 1;pmessage = new char[len];strcpy_s(pmessage,len,aMess.pmessage);}
这样就可以了。

所以必须记住一点:如果动态地为本地C++类的成员分配空间,则必须实现复制构造函数。


0 0
原创粉丝点击