Cout没有返回任何输出

Cout not returning any output

本文关键字:任何 输出 返回 Cout      更新时间:2023-10-16

我正在学习c++,发现了一个我不理解的问题。我有一个简单的代码:

#include <iostream>
#include <vector>

class Person
{
    string * name;
public:
    Person(const string & n) : name {new string {n}} {}
    ~Person() {delete name;}
    string getName() const {return *name;}
};

int main()
{
    vector<Person> people;
    people.push_back(Person("Tom"));
    cout << "Name is: " << people.back().getName() << endl;
    return 0;
}

当我运行它时,我没有输出。不知道为什么?然而,当我做类似的事情,但没有矢量时,一切都可以:

int main()
{
    Person tom {"Tom"};
    cout << "Name is: " << tom.getName() << endl;
    return 0;
}

正如其他人所说,最好不要使用指针。然而,如果您想知道发生了什么,那么得到的原因是在这一行中创建了people.push_back(Person("Tom")); Person对象,并将其副本传递给vector。但是,一旦复制了对象,就会执行析构函数,从而删除字符串。

使用指针时,原始Person对象及其副本都指向内存中的同一字符串。字符串被析构函数删除,并且副本中的name指针不指向任何内容。因此,你会得到不明确的行为。

要纠正这个问题,要么不使用指针,要么需要定义自己的复制构造函数。例如:

class Person
{
    string * name;
public:
    Person(const string & n) : name {new string {n}} {}
    // copy constructor which makes new string in memory
    //based on the original string.
    Person(const Person & other) {
        name = new string(other.getName());
    }
    ~Person() { delete name; }
    string getName() const {return *name;}
};

您使用了错误的类型。您的string已经是字符串类型。这样写代码。

class Person
{
public:
    Person (const string& n) : name(n) { }
    ~Person() {}
    string getName() const { return name; }
private:
    string name;
};

如果您坚持在成员变量中使用指针,则应覆盖复制构造函数和重载赋值运算符。

举个例子:

class Person
{
public:
    Person (const char* n)   : name(new char[strlen(n)+1])      { strcpy(name, n);      }
    Person (const Person& p) : name(new char[strlen(p.name)+1]) { strcpy(name, p.name); }
    ~Person() { delete [] name; }
    Person& operator=(const Person& p)
    {
        if ( &p == this ) return *this;
        delete [] name;
        name = new char[strlen(p.name)+1];
        strcpy(name, p.name);
        return *this;
    }
    string getName() const { return name; }
private:
    char* name;
};

您的代码有缺陷的原因已经解释过了,但如果您有C++11,则可以使用emplace_back:

people.emplace_back("Tom");

尽管如此,使用指针而不是普通成员变量只是不必要地使程序复杂化。你必须做的内存管理越少越好。阅读零规则。更好的是,如果您的getName()函数没有做任何特殊的事情,请删除它,然后将name公开。