C++ C++;类和未定义的行为

C++ C++;类和未定义的行为,c++,class,C++,Class,我想问一下,我的代码是否安全——没有任何意外行为 #include <cstdio> #include <cstring> class Test { private: char something[20]; public: Test(){ strcpy(something,"Hello world!"); } ~Test() { printf("Destructor\n"); } operator ch

我想问一下,我的代码是否安全——没有任何意外行为

#include <cstdio>
#include <cstring>

class Test {

private:
char something[20];

public:
Test(){
    strcpy(something,"Hello world!");
}
~Test() {
    printf("Destructor\n");
    }
operator char*() {
       return something;
    }
};

int main(){
    printf ("%s\n",(char*)Test());
    
    printf("End of main\n");
    return 0;
}

但这会一直持续下去吗?包括不同的编译器。在printf函数之后,对象总是被破坏吗?这段代码安全吗?

您的代码看起来很奇怪,但我看不到任何未定义的内容

至少应该使用
静态\u cast
,而不是c样式的cast:

printf ("%s\n",static_cast<char*>(Test()));

并且可能考虑提供一个输出操作符重载,以便您可以编写<代码> STD::COUT,我将实现操作程序。使用<代码> STD::String < /C> >代替字符数组,可以使代码更安全。阵列可能下溢或溢出。此外,如果缺少终止nul字符,可能会发生未定义的行为。您不需要重载

运算符char*
。使用吸气剂。此外,考虑是否要返回一个正则指针(以便用户可以修改字符串)或指向常数数据的指针,这样用户就不能修改字符串。想象一下任何其他使用char*的函数。在将文本复制到数组中之前,您应该测试任何文本的长度(考虑终止的nul字符)。阵列的容量可能会更改,并且可能会跳过某些更改的传播:-(转换运算符是否应返回引用仍有争议。你可以这样说。IMHO,
运算符
应替换为getter方法。在
运算符
像这样重载的情况下,我看不到太多代码。@ThomasMatthews我只在极少数特殊情况下使用非显式转换。将修复此问题。)“那个。”弗朗索瓦·安德里厄克斯我设法避免了那场辩论,提议不使用转换;)谢谢,这回答了我的问题
printf ("%s\n",static_cast<char*>(Test()));
#include <iostream>
#include <string>

class Test {
    std::string something;
    public:
    Test() : something("Hello World") {}
    ~Test() {
        std::cout << "destructor\n";
    }
    std::string get_something() {
        return something;
    }
};

int main(){
    std::cout << Test().get_something();
    std::cout << "End of main\n";
}