nullptr模拟实现

C++11,其中有一个是新的关键字nullptr,如果我们的编译器是支持nullptr的话,那么我们应该直接使用nullptr来替代NULL的宏定义。正常使用过程中他们是完全等价的。某些编译器不支持c++11的新关键字nullptr,我们也可以模拟实现一个nullptr。

const
class nullptr_t {
public:
    template<class T>
    inline operator T*() const {
    return 0;
    }

    template<class C, class T>
    inline operator T C::*() const {
    return 0;
    }
 
private:
    void operator&() const;
} nullptr = {};


#undef NULL
#define NULL nullptr


### 实现C++自定义String类 为了创建一个具备基本功能的`String`类,可以考虑以下几个方面: #### 类成员变量 首先声明私有成员来存储字符数组以及字符串长度。 ```cpp class Mystring { private: char* str; size_t length; }; ``` 这允许内部管理动态分配的内存用于保存实际字符串数据[^1]。 #### 构造函数与析构函数 提供默认构造函数、带参数构造函数和拷贝构造函数,并实现析构函数以释放资源。 ```cpp public: // 默认构造函数 Mystring() : str(nullptr), length(0) {} // 带参构造函数 explicit Mystring(const char* s) { if (s != nullptr) { length = strlen(s); str = new char[length + 1]; strcpy(str, s); } else { str = nullptr; length = 0; } } // 拷贝构造函数 Mystring(const Mystring& source) { length = source.length; if (source.str != nullptr) { str = new char[source.length + 1]; strcpy(str, source.str); } else { str = nullptr; } } // 析构函数 ~Mystring() { delete[] str; } } ``` 上述代码展示了如何初始化对象并处理深浅复制问题。 #### 运算符重载 通过运算符重载使`Mystring`能够像内置类型一样操作。这里展示赋值运算符(`=`)的例子。 ```cpp // 赋值运算符 Mystring& operator=(const Mystring& rhs) { if (this == &rhs) return *this; delete[] str; length = rhs.length; if (rhs.str != nullptr) { str = new char[rhs.length + 1]; strcpy(str, rhs.str); } else { str = nullptr; } return *this; } ``` 此部分实现了安全的对象间赋值逻辑。 #### 成员方法 增加一些实用的方法如获取字符串大小、访问单个字符等。 ```cpp size_t get_length() const {return length;} char at(size_t pos) const {if(pos<length)return str[pos];else throw std::out_of_range("Out of range");} void append(const Mystring& other){ char* temp = new char[this->length + other.length + 1]; strcpy(temp, this->str); strcat(temp, other.str); delete[] this->str; this->str = temp; this->length += other.length; } ``` 这些辅助函数增强了类的功能性和易用性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值