这段代码的输出是什么,它在构造函数中使用了 strcpy?

what would be the output of this code, it uses strcpy in a constructor?

您好,我对一些代码有疑问。 这段代码应该像这里一样工作吗?

我想我需要使用#include cstring

我问过我的老师,他告诉我代码很好,而且 它应该与#include string

一起使用

这是正确的吗?有人可以解释一下吗?谢谢。

#include <iostream>
#include <string> //strcpy() works with string?
using namespace std;

class libraryBook{

  private:

    char title [80]; //cstring
    int available;

  public:

    libraryBook(char initTitle[]);//cstring as argument

};


libraryBook::libraryBook(char initTitle[]){

  strcpy(title, initTitle); 
  available = 1;

}


int main() {

  libraryBook b1 ("computing"); //what would be the output without changing the code ?

  return 0 ;
}

简而言之,"as is",程序可能编译也可能不编译。如果你想要 strcpy() 函数,你需要包含 <cstring> (正如@user4581301 在评论中指出的那样。

包含 <cstring> 之后,程序的输出为空,因为您没有打印任何内容。但实际上,您不应该在 C++ 中使用字符数组代替 std::string。可以找到您的代码演示 here

TL;DR

使用 <cstring> 而不是 <string>,但即使更正了 header,程序也没有输出。

讨论

I thought I would need to use #include cstring

I asked my teacher and he told me that the code is good as it is and that it should work with #include string

你想对了,老师错了1C++ Standard 不保证 strcpy 通过包含 <string>.

可用

1 Sort-of错了。无法保证 <string> 提供 strcpy 或最终包含 <cstring> 的 header 链,但没有人说它不能。只是不要指望它。文件应始终包含它需要的所有 header2 以防止出现可避免的错误。老师也可能被他们的大脑愚弄,当他们告诉你你的代码是正确的时候,在没有 c 的地方看到了 c。他们可能想让你使用旧的 C header <string.h>。不好说。

2 有时您会发现 header 您希望包含另一个 header 而不是 forward declares 的部分other header 它需要避免包含 other header.

的 compile-time 开销

至少在我看来,你老师的想法显然更好。一个半途合理的起点是这样的:

#include <string>

class LibraryBook { 
    std::string name;
    int available;
public:
    LibraryBook(std::string const &name, int available = 1) 
        : name(name)
        , available(available) 
    {}
};

然后创建一本书看起来像这样:

LibraryBook book("Steal This Code");

因为我们没有包含任何代码来写出任何东西,所以这不会产生任何输出(除了返回一个代码来指示成功退出)。