解引用和箭头操作符
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; }
相关文章推荐
- DM9000网卡的基本工作原理
- iOS 宏(define)与常量(const)的正确使用
- android 加载图片
- javascript知识结构
- OCX控件的简单开发实例
- C/C++—— 输入两点坐标(X1,Y1),(X2,Y2),计算并输出两点间的距离
- ES2015 - Object (6)
- 【redis】跟着redis tutorial的基本学习
- POJ 2553 The Bottom of a Graph TarJan算法题解
- PIC16F877A最小功能板 - 原理图系列
- HTTP状态码302,303,307间的那些事
- 实现一个复杂的悬浮窗
- python异常处理 try.....except
- 通过ArcMap查看发布在geoserver中的地图数据
- excel实现appium关键字驱动
- POJ1185 炮兵阵地 状压dp
- HTML5背景音乐的暂停与播放
- HTML5背景音乐的暂停与播放
- 基本的Git使用总结(二)
- QTableview的一些用法