【问题标题】:C++ How to display/print a string object? cout << int works, cout << string notC ++如何显示/打印字符串对象? cout << int 有效, cout << string 无效
【发布时间】:2011-08-05 23:37:25
【问题描述】:

我遇到了一个谷歌无法解决的问题。为什么 cout 适用于 int 对象而不适用于以下程序中的字符串对象?

#include<iostream>
using namespace std;
class MyClass {
    string val;
public:
    //Normal constructor.
    MyClass(string i) {
        val= i;
        cout << "Inside normal constructor\n";
    }
    //Copy constructor 
    MyClass(const MyClass &o) {
        val = o.val;
        cout << "Inside copy constructor.\n";
    }
    string getval() {return val; }
};
void display(MyClass ob)
{
    cout << ob.getval() << endl;    //works for int but not strings
}
int main()
{
    MyClass a("Hello");
    display(a);
    return 0;
}

【问题讨论】:

  • “作品”是什么意思?你为什么不让getval() const 呢?
  • 为我工作。你的seen 输出和expected 输出是什么。它们应该以什么方式不同。

标签: c++ string class object cout


【解决方案1】:

您必须包含string 标头才能获得重载的operator&lt;&lt;

此外,您可能希望从 getval 返回 const string&amp; 而不是 string,将构造函数更改为接受 const string&amp; 而不是 string,并将 display 更改为接受 @987654329 @ 避免不必要的复制。

【讨论】:

  • 在这种情况下(大多数)编译器不应该能够执行复制省略吗?只是想知道,我听到很多关于按值返回和让编译器优化或按常量引用返回的意见。
  • @Shelling 我可能已经过时了,但是当我不想复制并且不想从函数内部更改外部对象时,我更喜欢使用const T&amp; .这既使您的意图清晰,又消除了编译器愚蠢的可能性。它还可以防止您意外地做一些您从未打算做的事情(例如更改函数中的参数,这会使编译器不会忽略)。
  • 当然,我当时只考虑发布版本。但是,如果我返回或传递来自或传递给函数的常量引用,而不是在发布版本中将被省略的副本,那不会使发布版本的构建速度慢一点吗? (当然,它可能并不明显)或者我只是太相信编译器了? :D
  • @Techno 如果此答案回答了您的问题,请点击左上角的复选标记将其标记为答案。
【解决方案2】:

我不知道什么对你有用,或者你是否修复了它,但我只是在做这个……对于你的 cout,你必须把这条线写成 cout

【讨论】:

    猜你喜欢
    • 2023-03-17
    • 2013-03-13
    • 2021-10-12
    • 1970-01-01
    • 2013-12-11
    • 1970-01-01
    • 2011-01-29
    相关资源
    最近更新 更多