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

时间:2019-04-10 23:42:51

标签: c++ class c-strings strcpy

您好,我对某些代码有疑问。 这段代码可以正常工作吗?

我认为我需要使用#include cstring

我问我的老师,他告诉我代码本身是好的,并且 它应该与#include字符串

一起使用

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

#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 ;
}

3 个答案:

答案 0 :(得分:1)

简而言之,程序“按原样”可能会编译,也可能不会编译。如果要使用<cstring>函数(如@ user4581301的注释所指出的那样),则需要包含strcpy()

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

答案 1 :(得分:1)

TL; DR

使用<cstring>来代替<string>,但即使更正了标题,程序也没有输出。

讨论

  

我认为我需要使用#include cstring

     

我问老师,他告诉我代码本身是不错的,并且应该与#include字符串一起使用

您认为正确,而老师是错误的 1 C++ Standard不能保证通过包含strcpy使<string>可用。

1 排序错误。无法保证<string>提供strcpy或最终包含<cstring>的标头链,但是没有人说不能。只是不要指望它。文件应始终包含其需要的所有标头 2 ,以防止发生可避免的错误。当他们告诉您您的代码正确时,老师也可能被他们的大脑愚弄了,看到一个c,而没有c。它们可能意味着您要使用旧的C头文件<string.h>。很难说。

2 有时,您会找到一个标头,希望它包含另一个标头,而不是forward declares另一个标头的部分,它需要避免编译时的开销。包括另一个标题。

答案 2 :(得分:1)

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

#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");

由于我们未包含任何代码来写出任何内容,因此不会产生任何输出(除了返回指示成功退出的代码外)。

相关问题