【问题标题】:How to pass char as function argument in class?如何在类中将 char 作为函数参数传递?
【发布时间】:2014-07-09 15:29:14
【问题描述】:
#include <iostream>

using namespace std;

class X{
    private:
        char ime[50];
    X(char *c){ // or char (char c[]) which one to use?
        // how to set the value of c inside the ime[50];
    }
};

int main()
{

    return 0;
}

我想在类的构造函数中将 char 作为函数参数传递,所以我可以使用两种方式.. 我应该使用哪一种?而一旦传了值,怎么把c的值放到类的char ime[50]变量里面呢?

【问题讨论】:

  • 请改用std::string。否则你将不得不担心被传递的东西的长度。
  • ... 或使用 std::vector&lt;char&gt; - 取决于您的需要。
  • @juanchopanza 用于指定我应该使用具有指定最大长度的字符的练习。
  • 好的,那么你必须确保你复制的字符数不超过 50 个,记住字符串“aka c-strings”是以 nul 结尾的,即它们的结尾用 '\0' 标记特点。无论你的函数参数是char* 还是char[] 都是装饰性的。
  • 为什么要添加“使用命名空间标准”?这是一个坏习惯。

标签: c++ class char


【解决方案1】:

正如评论所建议的,使用std::string 的最简单方法。另外,如果你的构造函数不是public,没有人可以调用它。

class X{
    private:
        std::string ime;
    public:
        X(const std::string& str) : ime(str) {
        }
};

如果您坚持使用 char*,并且您确信您将永远传入长度为 50 的字符数组,您可以使用memcpy.

class X{
    private:
        char ime[50];
    public:
        X(const char* c) {
            memcpy(ime,c,50);
        }
};

如果你坚持char*并且你不知道长度有多长(只知道它小于50),你将不得不传入长度。 p>

class X{
    private:
        char ime[50];
    public:
        X(const char* c, int length) {
            if (length > 50) length = 50;
            memcpy(ime,c,length);
        }
};

请注意,我们使用memcpy 而不是strncpy,因为我不会对您的char[] 中的内容做出任何假设。

【讨论】:

  • @merlin2011 为什么不是 "str" const ref?
  • @hellfire769,更正。太仓促了。 :)
  • 为什么我不能调用对象例如 X x("hfsfasdasfsdsa"),它说 (char*) 是私有的?
  • @user3659335,这很奇怪。让我检查一下。
  • @user3659335,你必须给我一个可重现的例子。我无法重现您的错误。
【解决方案2】:

两者相同,使用C字符串复制例程将数据复制到内部缓冲区中。

注意传入的字符串长度,只复制前50个字符。

但实际上,使用 std (string or vector, basic_str) 更简单/更安全

【讨论】:

    【解决方案3】:

    您必须考虑以下几点:

      1234563数据成员数组。
    1. 您应该将参数作为 const 传递,因为它不会在构造函数的主体中被修改(即)。

    2. 如果您传递的是一个 char 值数组(而不是一个以 null 结尾的字符串),您应该将数组的大小作为另一个参数传递给构造函数。然后,在构造函数体内,使用复制例程(例如 std::copy)将所需数量的 char 值(由附加参数指定)复制到数据成员数组。

    3. 在这种情况下,char* 或 char[] 表示法之间没有区别,因为它们都将指定传递给函数的 char 指针参数。有关这些符号之间差异的更多信息,请参阅this thread

    【讨论】:

      猜你喜欢
      • 2015-09-26
      • 1970-01-01
      • 2020-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-30
      • 2015-12-23
      相关资源
      最近更新 更多