【问题标题】:Why there is no output when I use string in c++?为什么我在 C++ 中使用字符串时没有输出?
【发布时间】:2020-09-08 12:42:24
【问题描述】:
class A{
   private :  string a[3];
   public :   A();
              void ShowA();
}

A::A(){ string a[3] = {"aa","bb","cc"}  }
void A::ShowA(){
   for(int x=0;x<=2;x++){
       cout<< a[x];
   }
}
int main(){
    A a;
    a.ShowA();
    return 0;
}

在这段代码中,我认为输出是 aabbcc 但什么都没有。只是空白存在。 你能告诉我它为什么会发生以及如何解决它。 伙计们干杯。

【问题讨论】:

  • string a[3] 在您的构造函数中创建一个新的局部变量(与同名的成员变量完全无关),该变量会立即被丢弃。有关更现代的方法,请参阅 Initializing a member array in constructor initializerC++ Initializing Non-Static Member Array
  • 您正在隐藏自己对 a 的定义,并分配给后来被丢弃的局部变量。
  • 您有一个名为a 的成员,并且在构造函数中您有一个位于构造函数本地的a。阅读范围(和std::array 和成员初始化)
  • 考虑在这里使用std::vector

标签: c++ string


【解决方案1】:

正如 cmets 告诉您的,您在构造函数中创建了一个局部变量 a,而不是设置属性 a 的值。您可以在member initializer list 中设置a 的值。

代码变成

#include <iostream>
#include <string>

using namespace std;

class A {
private:
    string a[3];

public:
    A();
    void ShowA();
};

A::A() : a{"aa"s, "bb"s, "cc"s} {}

void A::ShowA() {
    for(int x = 0; x <= 2; x++) {
        cout << a[x] << std::endl;
    }
}
int main() {
    A a;
    a.ShowA();
    return 0;
}

注意:“aa”、“bb”和“cc”字符串后面的“s”是string literal。在这种情况下实际上没有必要,因为编译器知道您正在创建一个 std::string 对象数组。

【讨论】:

  • 可以问A::A() : a{"aa"s, "bb"s, "cc"s} {}是什么意思??
  • 您可以随时询问。那是成员初始值设定项列表。这是一种初始化成员变量的方法。语法是“:”后跟变量名及其值,括号或大括号之间。如果您有多个成员变量,则添加逗号,然后添加下一个变量,依此类推。请注意,它不在构造函数主体中(这有好处)。请参阅答案中“成员初始化程序列表”的链接。
  • 哦,我错过了最后的 cmets。我会试着去理解和思考自己。非常感谢,干杯!
【解决方案2】:

您在构造函数中重新定义了字符串“a”,您应该在构造函数中简单地分配它,而不是再次使用“字符串”类型。如果再次给出类型,它会创建一个仅在构造函数范围内可用的局部变量。

【讨论】:

    猜你喜欢
    • 2020-01-22
    • 2013-08-17
    • 2021-02-20
    • 2020-03-15
    • 1970-01-01
    • 2021-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多