typedef struct book {
int a;
int b;
char cb[100];
book(int a1, int b1, char* cb1) {
a = a1;
b = b1;
cb = cb1;
}
} book;
为什么我不能将cb初始化为cb1,如何在不使用strcpy的情况下完成它?
为什么我不能将cb初始化为cb1,如何在不使用strcpy的情况下进行初始化?
cb1
是char*
类型,但cb
是C风格的数组,也就是正式的数组对象类型(具体来说是一个char[100]
)。数组对象类型无法被修改(即使它们是lvalue)。如果你只想进行浅拷贝而不是像你所说的strcpy()
,那么你可以将cb
定义为char*
而不是char[100]
:
typedef struct book {
// ...
char* cb;
book(int a1, int b1, char* cb1) {
// ...
cb = cb1;
}
} book;
但在大多数情况下,我不建议这样做,因为它会导致对原始指针的不稳定管理。既然标记为[C++],有没有使用std::string
的理由呢?
int main() {
book b(4, 2, "Hello");
return 0;
}
一个相当标准的编译器,例如Clang,会立即让你知道:
ISO C++11不允许将字符串文字转换为“
char *
”。
这种从字符串字面量(其类型为const char[]
)到char*
的隐式转换,即使在C++03中也已经过时,现在自C++11起完全删除。
1默认情况下,这至少是一个警告,并且在例如使用-pedantic-errors
构建时会出错。
#include <string>
struct book {
int a;
int b;
std::string cb;
book(int a1, int b1, std::string cb1) {
a = a1;
b = b1;
cb = cb1;
}
} book;
std::string
,您可以避免复杂的初始化。std::string
#include <iostream>
#include <string>
class book {
public:
int a;
int b;
std::string cb;
book(int a, int b, const char* cb)
: a(a),
b(b),
cb(cb)
{
}
};
int main()
{
using namespace std;
const book test(5, 17, "Woot!");
cout << "Hello " << test.cb << endl;
return 0;
}
$main
Hello Woot!
cb
参数定义为std::string
类型。 - Destructorconst
来声明数据成员不是一个好主意。 - M.M
cb
是一个数组,不是指针,不能被赋值。它实际上是在结构体内为您分配的内存,您获得了这个内存块的关键。这就像“嘿,我买了一栋房子,它在 Wayway Ave 39 号”,然后你的妻子说“太好了,你能把它搬到 Wayway Ave 40 号吗?”如果您想要一个可以赋值的指针,请使用char *cb
。 - Amadan