使用构造函数初始化字符串指针

时间:2013-02-08 16:08:28

标签: c++ string constructor

我的代码出现问题。我很难过。 我有一个数据成员,它是一个指向字符串类型的指针。 我使用构造函数作为此指针的defualt initialer,然后当我在main函数中调用一个对象时,初始化指针指向存储字符串的内存地址并打印内容。这应该是应该发生的,但我不能让程序工作。请问有人请告诉我哪里出错了?

#include<iostream>
#include<string>

using namespace std;

class NoName{
public:
    NoName(string &sName("Alice In Wonderland") ){};
private:
    string *pstring;
};

int main(){
    //the constructor will be automatically called here once a object is created
    // and the string "Alice in Wonderland" will appear on the screen
    return 0;
}

3 个答案:

答案 0 :(得分:5)

只需使用std::string成员并在 Member initializer list 中对其进行初始化:

 private:
    string mstring;

 public:
    NoName():mstring("Alice In Wonderland"){} 

你也可以让构造函数接受一个参数,而不是硬编码字符串,让用户在运行时传递字符串:

NoName(std::string str):mstring(str){}

您不需要指针。通过使用指向std::string的指针,您可以消除std::string提供的隐式手动内存管理的优势。

答案 1 :(得分:2)

如果由于某种原因确实需要存储指针,那么需要记住一些要点:

  • 指针初始化为new Class
  • 首选初始化成员初始化列表中的类成员
  • 每当您撰写单词new时,请考虑您要写下delete的位置。 (在这种情况下,它会进入析构函数。
  • 三条规则:如果你需要一个析构函数(你可以,因为delete),那么你还需要一个复制构造函数和复制赋值运算符。

这是代码看起来的一种方式:http://ideone.com/21yGgC

#include<iostream>
#include<string>

using std::cout; using std::endl;
using std::string;

class NoName
{
public:
    NoName(string sName = "Alice In Wonderland") :
        pstring(new string(sName))
    {
      cout << "ctor - " << *pstring << endl;
    }
    NoName(const NoName& rhs) :
        pstring(new string(*rhs.pstring))
    {
      cout << "Copy ctor - " << *pstring << endl;
    }
    NoName& operator=(const NoName& rhs)
    {
      *pstring = *rhs.pstring;
      cout << "Copy assignment operator - " << *pstring << endl;
      return *this;
    }

    ~NoName()
    {
        cout << "dtor, my name was " << *pstring << endl;
        delete pstring;
    }
private:
    string *pstring;
};

int main()
{
    NoName m, n("Another name");
    NoName o(m);
    o = n;

    return 0;
}

请注意,如果您不使用不必要的指针,那将会更容易:

class Better
{
public:
    Better(string sName = "Alice In Wonderland") :
        m_string(sName)
    {
    }
private:
    string m_string;
};

因为您不需要自定义析构函数,所以您也不需要复制构造函数或复制赋值运算符。更容易!

答案 2 :(得分:0)

您没有正确使用构造函数。首先,您创建此引用参数并尝试将其初始化为字符串对象(这就是问题)。其次,你的构造函数实际上从不做任何事情。

您需要在指针上调用new,取消引用它并将数据指向一个值,使用std::cout输出解除引用的值,然后使用delete清除内存析构函数(或者在这种情况下,如果你不打算再次使用该字符串,你可以在使用cout之后再执行它。但是如果你还需要它,那么在析构函数中做它。)

假设你正在上课,你的教科书应该告诉你如何做这些事情。

编辑:这也不是默认构造函数。我改变了你的标签以适当匹配。