C++ C++;:初始化类构造函数中的字符数组和int
我试图找到一个指南,甚至找到了,但它没有提供一个答案。 我的问题是如何在构造函数中初始化C数组?下面我举了一个我想做的假设性例子,但是我不知道它是好是坏,还是完美,或者只是有什么不对劲,有什么办法可以让它变得更好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(){
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++中引用的字符串(例如