C++ const char*的值在构造后返回空

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() {

将此矢量3转换为常量字符*在隐式和显式转换中都有效,但在构造时尝试转换时却没有。只有这样,const char*“v3pchar”才会返回空白。有什么想法吗?完整代码如下。谢谢

#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。也不知道是的。值得记住的是,在大多数情况下,从函数或类方法返回裸指针是在自找麻烦;你必须对生命有绝对的把握