你可以帮我解决这个问题吗?
#include <iostream>
#include <cstring>
using namespace std;
class A
{
public:
char str[4];
A()
{
str = "C++";
cout << "Constructor A" << endl;
}
void display()
{
cout << str << " is your name" << endl;
}
};
int main()
{
A a;
a.display();
return 0;
}
它会出现以下错误:
**************************Error**********
StringProg.cpp:9: error: ISO C++ forbids initialization of member "str"
StringProg.cpp:9: error: making "str" static StringProg.cpp:9: error: invalid in-class initialization of static data member of non-integral type "char [4]"
StringProg.cpp: In member function "void A::display()":
StringProg.cpp:17: error: "str" was not declared in this scope
**************************
答案 0 :(得分:7)
C阵列存在很多问题,阻碍您做您想做的事情。
字符串文字的类型为const char[n]
(n
为\0
字符的长度+ 1)。要在C标准库函数中使用它们,它们会衰减到const char*
,它不具有字符串的大小,并且为了找到它,需要遍历字符串(每个字符都被查看和比较到\0
)
因此,数组赋值运算符需要相当重要;这不是由语言提供的,您必须使用像strcpy
这样的库函数将文字移动到可用的内存中。换句话说,您不能像其他值一样分配C数组。
数组以非常原始的方式运行;他们没有比较运算符,很难将它们传递给函数并正确存储在类中。
所以,因为以上所有......
std::string
至char[]
:class A {
std::string str;
public:
// prefer constructor init list
A() : str("C++") {
// your line would work, too
std::cout << "Constructor A" << std::endl;
}
void display() const {
std::cout << str << " is your name" << std::endl;
}
};
int main()
{
A a;
a.display();
// return 0; is unnecessary
}
一些“经验法则”(拇指规则?):如果您需要多个元素,请从vector<>
开始。永远不要使用C数组。 string
是一个元素,而不是“字符数组”。
答案 1 :(得分:-1)
尝试以下
#include<iostream>
#include<cstring>
class A
{
private:
char str[4];
public:
A() : str { "C++" }
{
std::cout << "Constructor A" << std::endl;
}
void display() const
{
std::cout << str << " is your name" << std::endl;
}
};
int main()
{
A a;
a.display();
return 0;
}
程序输出
Constructor A
C++ is your name
考虑到数组没有复制赋值运算符。因此,您的程序中的此声明
str = "C++';
即使更新拼写错误并写入
str = "C++";
无效。
您可以使用标头strcpy
中声明的标准C函数<cstring>
。例如
#include <cstring>
//...
A()
{
std::strcpy( str, "C++" );
std::cout << "Constructor A" << std::endl;
}