C++ const char*的值在构造后返回空
将此矢量3转换为常量字符*在隐式和显式转换中都有效,但在构造时尝试转换时却没有。只有这样,const char*“v3pchar”才会返回空白。有什么想法吗?完整代码如下。谢谢C++ const char*的值在构造后返回空,c++,casting,char-pointer,C++,Casting,Char Pointer,将此矢量3转换为常量字符*在隐式和显式转换中都有效,但在构造时尝试转换时却没有。只有这样,const char*“v3pchar”才会返回空白。有什么想法吗?完整代码如下。谢谢 #include <stdio.h> #include <iostream> #include <string> using namespace std; struct Vector3 { int x, y, z = 0; Vector3() {
#include <stdio.h>
#include <iostream>
#include <string>
using namespace std;
struct Vector3 {
int x, y, z = 0;
Vector3() {
cout << "Vector3()" << endl;
};
Vector3(int X, int Y, int Z) : x(X), y(Y), z(Z) {
cout << "Vector3(int X, int Y, int Z)" << endl;
};
// Focal point here
operator const char* () {
cout << "operator const char* called" << endl;
v3string = to_string(x) + ", " + to_string(y) + ", " + to_string(z);
v3pchar = v3string.c_str();
return v3pchar;
}
private:
string v3string = "Never even blank";
const char* v3pchar = "So why does this become blank?";
};
int main() {
Vector3 v1 = Vector3(1, 2, 3);
cout << "Vector3 implicit cast to char*: [" << v1 << "]" << endl; // Works
const char* v2 = v1;
printf("Vector3 explicit cast to char*: [%s]\n", (const char*)v2); // Works
cout << "---------------------------------------------" << endl;
const char* v3 = Vector3(4, 5, 6);
cout << "Vector3 instantiation cast to char*: [" << v3 << "]" << endl; // Empty
return 0;
};
#包括
#包括
#包括
使用名称空间std;
结构向量3{
int x,y,z=0;
向量3(){
库特
由c_str()
返回的const char*
指针归其std::string
所有,并且只有在std::string
被修改或销毁之前才有效,以先到者为准。胶囊摘要:只要v3string
被修改或销毁,v3pchar
就不再有效
const char* v3 = Vector3(4, 5, 6);
这将导致以下事件序列:
创建并构造一个临时的Vector3
对象
调用其运算符const char*
方法,并返回一个内部std::string
所拥有的const char*
,该字符串是Vector3
对象的成员
返回的const char*
被分配给v3
临时Vector3
对象及其std::string
成员将被销毁
它遵循最初返回的const char*
指针不再有效,因为拥有它的std::string
对象现在已被销毁
任何后续使用此const char*
指针都会导致未定义的行为
可以修改显示代码,使用现代C++中的一些特性,导致该结构变得不正确(类方法REF限定符)让你的C++编译器捕捉到这个常见的错误。但是这是另一个问题;至于你观察到的结果的原因:它是由于上面的原因而未定义的行为。
由c_str()
返回的const char*
指针归其std::string
所有,并且只有在std::string
被修改或销毁之前才有效,以先到者为准。胶囊摘要:只要v3string
被修改或销毁,v3pchar
就不再有效
const char* v3 = Vector3(4, 5, 6);
这将导致以下事件序列:
创建并构造一个临时的Vector3
对象
调用其运算符const char*
方法,并返回一个内部std::string
所拥有的const char*
,该字符串是Vector3
对象的成员
返回的const char*
被分配给v3
临时Vector3
对象及其std::string
成员将被销毁
它遵循最初返回的const char*
指针不再有效,因为拥有它的std::string
对象现在已被销毁
任何后续使用此const char*
指针都会导致未定义的行为
可以修改显示代码,使用现代C++中的一些特性,导致该结构变得不正确(类方法REF限定符)你的C++编译器会发现这个常见的错误,但是这是另一个问题,至于你观察到的结果的原因:它是由于上面的原因而未定义的行为。
代码> int x,y,z=0;< /Cord>你确定你不是指<代码> int x=0,y=0,z=0;< /Cord> >是的。你所做的只是将代码> z < /代码>设置为0和L。屋檐x
和y
未初始化,因此如果调用构造函数时没有参数,x
和y
将保持未初始化状态。使用未初始化变量是未定义的行为。int x=0,y=0,z=0;
将所有值设置为0以防止出现这种情况。@josephtaylor设置x
和y的值
默认情况下未初始化。如果您的第一个构造函数(不带参数)使用时,它们从不被赋值。因此,可能最终导致Vector3
对象处于“坏”状态。使用该对象(即,使用其x
和y
数据成员执行任何操作)将是未定义的行为。如果使用-Wa编译,编译器可以通知您这些事情ll
flag。哦,我甚至没有意识到!我以为它将它们都设置为0。也不知道是的。值得记住的是,在大多数情况下,从函数或类方法返回裸指针是自找麻烦的;您必须绝对确定正在寻址的任何对象的生存期。使用智能指针可以消除一些错误k、 请参见和intx,y,z=0;
您确定您的意思不是intx=0,y=0,z=0;
?是的。您所做的只是将z
设置为0,并使x
和y
未初始化,因此如果您调用没有参数的构造函数,x
和y
将保持未初始化状态。使用uninitializeed变量是未定义的行为。int x=0,y=0,z=0;
将所有值设置为0以防止出现这种情况。@Joseph Taylor默认情况下,x
和y
的值未初始化。如果您的第一个构造函数(不带参数)使用时,它们从不被赋值。因此,可能最终导致Vector3
对象处于“坏”状态。使用该对象(即,使用其x
和y
数据成员执行任何操作)将是未定义的行为。如果使用-Wa编译,编译器可以通知您这些事情ll
flag。哦,我甚至没有意识到!我以为它将它们都设置为0。也不知道是的。值得记住的是,在大多数情况下,从函数或类方法返回裸指针是在自找麻烦;你必须对生命有绝对的把握