您的位置:首页 > 其它

解引用和箭头操作符

2016-03-22 13:32 477 查看
#include <iostream>
#include "string.h"
#include "pointer.h"

using namespace std;

int main ()
{
String s("xiaocui");
s.display();

String *ps = &s;  // 这个是普通的指针,普通的指针容易产生野指针,
ps->display();

try
{
Pointer p1("C++");
p1->display();

String s = *p1;
s.display();

Pointer p2;
p2->display();
}
catch(String const &error)
{
error.display();
}

system("pause");
return 0;
}


#ifndef STRING_H
#define STRING_H

class String
{
public:
String(char const *chars = "");
String(String const &str);
~String(); // 析构函数释放动态的创建的,

void display() const;
private:
char *ptrChars;
};

#endif


#ifndef POINTER_H  // 头文件的保护防止发生多重包含,
#define POINTER_H

class String;  // 权值定义,

class Pointer // 这个是为了做智能指针,
{
public:
Pointer();
Pointer(String const &n);
~Pointer();

String &operator*(); // 解引用操作符
String *operator->() const;  // 箭头操作符,

private:
String *ptr;
static String errorMessage;
};

#endif


#include <iostream>
#include <ostream>
#include "string.h"

String::String(char const *chars)
{
chars = chars ? chars : "";  // 如果这是一个字符串将其变成一个空指针,
ptrChars = new char[std::strlen(chars) + 1]; // 加1 是字符串最后还有一个\0,
std::strcpy(ptrChars,chars);
}

String::String(String const &str)
{
ptrChars = new char[std::strlen(str.ptrChars) + 1];
std::strcpy(ptrChars,str.ptrChars);
}

String::~String()   // 析构函数是为了释放新创建中的new 的动态数据,防止内存泄漏
{
delete[] ptrChars;
}

void String::display() const
{
std::cout << ptrChars << std::endl;
}


#include "pointer.h"
#include "string.h"

Pointer::Pointer() : ptr(0) {}

Pointer::Pointer(String const &n)
{
ptr = new String (n);
}

Pointer::~Pointer()
{
delete ptr;
}
String Pointer::errorMessage("Uninitialized pointer");

String &Pointer::operator*()  // 对解引用操作进行重载,
{
if(!ptr)
throw errorMessage;
return *ptr;
}

String *Pointer::operator->() const
{
if(!ptr)
throw errorMessage;
return ptr;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: