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的情况下执行此操作? Why can’t I initialise
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的情况下执行此操作?
Why can’t I initialise cb to cb1 and how to do it without strcpy?
cb1的类型为char *,但cb是一个C风格的数组,a.k.a.正式作为数组类型的对象(这个特别是char [100]). Objects of array type cannot be modified(即使它们是左值).如果您只希望浅拷贝而不是像您所说的那样strcpy(),那么您可以将cb定义为char *而不是char [100]:
typedef struct book { // ... char* cb; book(int a1, int b1, char* cb1) { // ... cb = cb1; } } book;
但在大多数情况下,我不建议这样做,因为它会导致这个原始指针的不稳定管理.这被标记为[C],任何不使用std :: string的原因?
注意:虽然你没有标记这个[C 11]或更高版本,但是当你尝试使用上面的结构时,进一步的原因是不使用这样的原始指针或C风格的数组,可能是这样的:
int main() { book b(4, 2, "Hello"); return 0; }
一个非常标准的编译器,如Clang会立即让你知道1:
ISO C++11 does not allow conversion from string literal to ‘
char *
‘.
这种从字符串文字(the type of which is const char[]
)到char *的隐式转换即使在C 03和现在的completely removed since C++11.中也已弃用
1默认情况下,这至少会是一个警告,例如使用-pedantic-errors构建时会出错.