【问题标题】:Please help me understand this code [closed]请帮助我理解这段代码[关闭]
【发布时间】:2013-06-15 22:41:51
【问题描述】:
    #include<iostream>
    #include<string.h>
    using namespace std;

class MyString
{
private:
    char *m_pchString;
    int m_nLength;

public:
    MyString(const char *pchString="")          // explain this
    {
        m_nLength = strlen(pchString) + 1;

        m_pchString = new char[m_nLength];       // explain this

        strncpy(m_pchString, pchString, m_nLength);

        m_pchString[m_nLength-1] = '\0';
    }

    ~MyString()  
    {
        delete[] m_pchString;

        m_pchString = 0;
    }

    char* GetString() { return m_pchString; }    // explain this
    int GetLength() { return m_nLength; }
};


 int main()
 {
   MyString cMyName("Alex");
   cout << "My name is: " << cMyName.GetString() << endl;
   return 0;
 }

为什么在此使用 new 运算符....我了解其中的大部分内容,但我很困惑为什么使用 new 运算符为 char 指针分配一个数组....?这是一个 C++ 代码.....

【问题讨论】:

    标签: c++ c++11


    【解决方案1】:

    运算符new(实际上是new[]-Operator)用于获取具有m_nLength 元素的char 数组。析构函数中的delete[]-Operator 用于释放内存。

    【讨论】:

    • invalid copy semantics 用于让您在长时间的调试过程中保持愉悦。
    • @Mike Seymour 想说的是,实现复制构造函数也是一个非常好的主意,因为MyString 实例的副本将使用与原始缓冲区相同的缓冲区可能会导致意想不到的结果。如果随后销毁其中一个对象,则在使用另一个对象时很可能会出现段错误,因为指针将指向无效内存(由副本的析构函数释放)。
    • 还有一个复制赋值运算符。并移动这些版本。
    【解决方案2】:
    MyString(const char *pchString="") 
    

    MyString 类的构造函数,其 [可选] 参数的类型为 char*,因此,MyString str; 将是有效的。

    m_pchString = new char[m_nLength];
    

    m_pchString 是一个原始指针。在这个实现中,它指向garbage address(?)(不太确定,因为在 C++ 编译器中,指针未初始化为 NULL)。它需要在堆上分配第一个资源。如果处理不当,使用起来很危险。

    char* GetString() { return m_pchString; }
    

    它返回m_pchString的基地址,这样你就可以访问m_pchString指向的以下地址,找到0就停止。

    【讨论】:

    • 还要注意GetString的返回值不是const。可以在MyString 之外更改缓冲区,这将与数据封装的想法相矛盾。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-21
    • 2015-12-09
    • 2010-11-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多