Нужно ли инициализировать std :: string - PullRequest
0 голосов
/ 17 мая 2018

У меня есть этот код:

class myclass
{
    std::string str;
public:
    void setStr(std::string value)
    { 
        str=value;
    }
    std::string getStr()
    {
        return str;
    }
 }

 main()
 {
   myclass ms;
   std::cout<<ms.getStr()<<std::endl;
 }

Когда я компилирую и запускаю этот код, возникает ошибка, и в Windows я всегда получаю str как "".

Это всегда верно?

Мне нужно описанное выше поведение в том смысле, что если бы пользователь не вызывал set, str всегда будет пустой строкой.

я должен инициализировать str в конструкторе следующим образом:

class myclass
{
    std::string str;
public:
    myclass():str(""){}
    void setStr(std::string value)
    { 
        str=value;
    }
    std::string getStr()
    {
        return str;
    }
 }

Я хочу убедиться, что поведение одинаково на всех платформах, а также сделать код максимально маленьким и аккуратным.

Ответы [ 2 ]

0 голосов
/ 17 мая 2018

Вам не нужно инициализировать элемент string пустой строкой, хотя это может помочь сделать это в любом случае. Рассмотрим:

struct foo {
    std::string a;
    std::string b;
    foo() : a("foo") {}
};

Случайно или специально b не получил значение в конструкторе? Я бы предпочел

foo() : a("foo"), b() {}

потому что это делает намерение явным без всякой цены (не считая нескольких нажатий клавиш).

0 голосов
/ 17 мая 2018

Нужно ли инициализировать std :: string

Нет. std::string Конструктор по умолчанию инициализирует для вас красивую пустую строку.

Я хочу убедиться, что поведение одинаково на всех платформах, а также сделать код максимально маленьким и аккуратным.

Удалите помехи, затем:

struct myclass {
    std::string str;
};

Фундаментальные типы хотя, не инициализируются по умолчанию, их нужно инициализировать явно:

struct myclass {
    std::string str;
    int i = 1; // <--- initialize to 1.
};
...