解引用和箭头操作符

#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;
}

你可能感兴趣的:(解引用和箭头操作符)