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的情况下怎么办?
答案 0 :(得分:4)
为什么我不能将cb初始化为cb1,并且在没有strcpy的情况下怎么办?
cb1
的类型为char*
,但是cb
是C样式的数组,也就是形式为数组类型的对象(具体来说是一个char[100]
)。 Objects of array type cannot be modified(即使它们是 lvalue s)。如果您只想浅拷贝,而不是像您所说的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不允许从字符串文字转换为'
char *
'。
从字符串文字(the type of which is const char[]
)到char*
的隐式转换甚至在C ++ 03中也已弃用,现在completely removed since C++11.
1 默认情况下,这至少将是一个警告,并且在例如使用-pedantic-errors
构建时将是一个错误。
答案 1 :(得分:1)
您在问为什么不能在char[]
中初始化struct
?
您的问题的答案是因为:
数组是C语言中的``二等公民'';这种偏见的一个结果是,您无法将其分配给他们。数组在C和C ++中不是可修改的lvalue。
C和C ++都是不同的编程语言。在C ++中应避免使用普通的旧C样式数组,因为C ++语言提供了便利且更好的替代方法。
由于此问题已被标记为C ++问题,惯用的解决方案是在C ++中使用std::string。
因此,如果您执行以下操作会更好:
#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;
答案 2 :(得分:1)
您的帖子被标记为[C ++],但未使用现代习语。这是允许简单初始化的版本。通过使用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!