Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;:初始化类构造函数中的字符数组和int_C++ - Fatal编程技术网

C++ C++;:初始化类构造函数中的字符数组和int

C++ C++;:初始化类构造函数中的字符数组和int,c++,C++,我试图找到一个指南,甚至找到了,但它没有提供一个答案。 我的问题是如何在构造函数中初始化C数组?下面我举了一个我想做的假设性例子,但是我不知道它是好是坏,还是完美,或者只是有什么不对劲,有什么办法可以让它变得更好 class A{ private: char* a; int b; public: A(char*, int); } A::A(char* _a, int _b){ strcpy(a, _a); b = _b } int main(){

我试图找到一个指南,甚至找到了,但它没有提供一个答案。 我的问题是如何在构造函数中初始化C数组?下面我举了一个我想做的假设性例子,但是我不知道它是好是坏,还是完美,或者只是有什么不对劲,有什么办法可以让它变得更好

class A{
private:
    char* a;
    int b;
public:
    A(char*, int);
}

A::A(char* _a, int _b){
    strcpy(a, _a);
    b = _b
}

int main(){
    A tempA;
    char arr[50];
    int c = 40;

    strcpy(arr,"derp")
    tempA = new A(arr,c)

    return 0;
}

我目前还没有接近我的C++专家,所以我希望能得到尽可能多的反馈。如果这是一个重复的问题,也很抱歉,但我确实没有找到任何相关信息。

如果您想存储字符串,可以存储
std::string

class A{
private:
    std::string a;
    int b;
public:
    A(std::string const&, int);
}

A::A(std::string const& _a, int _b) : a(_a), b(_b) {}
如果您的讲师坚持将指向字符的指针视为字符串,那么您手头上就有一件复杂的事情,因为您必须管理字符自身指向的内存,以免最终导致错误。换句话说,您需要实现类似于
std::string
的东西

所以,假设你真的需要这么做

  • 每当您使用
    new
    时,您需要一个匹配的
    delete
    来释放
    new
    分配的内存
  • 您可能希望类的构造函数调用
    new
  • 如果使用具有类的自动存储持续时间的对象,并使用适当的析构函数进行清理,则可以自动完成
    delete
  • 该类可以被设置为不可复制(例如,通过设置私有复制构造函数和复制赋值操作符),或者如果您编写并修改,则可以被设置为可复制
  • 您可以使用
    std::copy
    算法轻松地进行复制,或者,如果由于任意原因而受到限制,您也可以使用旧的
    memcpy
    strcpy
    函数

这不是很简单,但如果您这样做,您将有一个非常方便的类自动为您管理内存,让您可以自由地关注其他问题。

如果您要存储字符串,您可以存储
std::string

class A{
private:
    std::string a;
    int b;
public:
    A(std::string const&, int);
}

A::A(std::string const& _a, int _b) : a(_a), b(_b) {}
如果您的讲师坚持将指向字符的指针视为字符串,那么您手头上就有一件复杂的事情,因为您必须管理字符自身指向的内存,以免最终导致错误。换句话说,您需要实现类似于
std::string
的东西

所以,假设你真的需要这么做

  • 每当您使用
    new
    时,您需要一个匹配的
    delete
    来释放
    new
    分配的内存
  • 您可能希望类的构造函数调用
    new
  • 如果使用具有类的自动存储持续时间的对象,并使用适当的析构函数进行清理,则可以自动完成
    delete
  • 该类可以被设置为不可复制(例如,通过设置私有复制构造函数和复制赋值操作符),或者如果您编写并修改,则可以被设置为可复制
  • 您可以使用
    std::copy
    算法轻松地进行复制,或者,如果由于任意原因而受到限制,您也可以使用旧的
    memcpy
    strcpy
    函数
这不是很简单,但如果你这样做,你会有一个非常方便的类自动为你管理内存,让你可以自由地关注其他问题。

strcpy(a,_a)
不会做你想做的事情:它假设
a
已经指向一些足够大的内存,可以包含
\u a
,事实并非如此

这是对当前代码的最小更改:

A::A(char *_a, int _b)
{
  a = strdup(_a); // makes a copy
  b = _b;
}
更惯用的用法是:使用初始值设定项列表,并承诺不会修改传入的数组(注意
const
):

一般来说,使用C++代码风格更好的是使用<代码> STD::String ,让它为您担心内存:

class A
{
  std::string a;
  int b;
public:
  A(char const *_a, int _b) : a(_a), b(_b) {}

  // we can provide two versions, so you can pass in a std::string as well
  A(std::string const &_a, int _b) : a(_a), b(_b) {}
};

由于无法使用
std::string
进行此分配,因此无法免费获得内存管理,因此需要编写析构函数:

A::~A()
{
  free(a);
}
否则,复制的
char*
数组将在实例死亡时泄漏。顺便说一句,你问题中的代码无论如何都会泄漏整个
A
对象。

strcpy(A,_A)
不会做你想做的事情:它假设
A
已经指向一些足够大的内存,可以包含
\u A
中的任何内容,但事实并非如此

这是对当前代码的最小更改:

A::A(char *_a, int _b)
{
  a = strdup(_a); // makes a copy
  b = _b;
}
更惯用的用法是:使用初始值设定项列表,并承诺不会修改传入的数组(注意
const
):

一般来说,使用C++代码风格更好的是使用<代码> STD::String ,让它为您担心内存:

class A
{
  std::string a;
  int b;
public:
  A(char const *_a, int _b) : a(_a), b(_b) {}

  // we can provide two versions, so you can pass in a std::string as well
  A(std::string const &_a, int _b) : a(_a), b(_b) {}
};

由于无法使用
std::string
进行此分配,因此无法免费获得内存管理,因此需要编写析构函数:

A::~A()
{
  free(a);
}

否则,复制的
char*
数组将在实例死亡时泄漏。顺便说一句,您问题中的代码将泄漏整个
对象。

如果需要使用c字符串(字符数组),可以使用while循环。请记住,C++中引用的字符串(例如:“test”)是C字符串,而不是字符串。

class A
{
private:
    char* a;
    int b;
public:
    char * get() {return a;}
    A(char*, int);
    A();
};

A::A(char* _a, int _b)
{
    int i=0, lenth=0;
    while(_a[i++])
        lenth++;
    a= new char[lenth+1];
    i=0;
    while(_a[i])
    {
        a[i]=_a[i];  
        i++;
    }
    a[i]=_a[i]; 

    b = _b;
}

int main()
{
    A *tempA;
    char arr[50];
    int c = 40;

    strcpy(arr,"test string");
    tempA = new A(arr,c);
    cout << tempA->get();

    return 0;
}
A类
{
私人:
char*a;
int b;
公众:
char*get(){返回一个;}
A(字符*,整数);
A();
};
A::A(字符*\u A,int\u b)
{
int i=0,lenth=0;
while(_a[i++]))
lenth++;
a=新字符[长度+1];
i=0;
而(_a[i])
{
a[i]=_a[i];
i++;
}
a[i]=_a[i];
b=_b;
}
int main()
{
A*坦帕;
char-arr[50];
int c=40;
strcpy(arr,“测试串”);
tempA=新的A(arr,c);
得不到();
返回0;
}

如果需要使用c-string(字符数组),可以使用while循环。还请记住C++中引用的字符串(例如