是否可以从不存在的实例调用方法?

vmo*_*eco 1 c++

我正在处理的代码:

我有以下代码(有关main.cpp中索引的错误):

Sample.hpp:

#ifndef SAMPLE_HPP
# define SAMPLE_HPP

# include <iostream>
# include <string>

class Sample{
public:
    Sample(void);
    ~Sample(void);
    void    tellname(void) const;
private:
    std::string     _name;
};

#endif
Run Code Online (Sandbox Code Playgroud)

Sample.cpp:

#include <iostream>
#include "Sample.hpp"

Sample::Sample(void){
    this->_name = "testname";
    return;
};

Sample::~Sample(void){
    return;
}

void    Sample::tellname(void) const{
    std::cout << "Name : " << this->_name << std::endl;
    return;
}
Run Code Online (Sandbox Code Playgroud)

main.cpp中

#include "Sample.hpp"

int     main(void){
    int     i;
    Sample  *test;

    test = new Sample[4];
    i = 0;
    while (i++ < 4)          // I know : i++; shouldn't be here
        test[i].tellname();
    delete [] test;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

如果我编译它,我得到以下输出:

Name : testname
Name : testname
Name : testname
Name :
Run Code Online (Sandbox Code Playgroud)

我的问题是:

关于最后一行,它调用一个方法(void Sample::tellname(void)),但是来自一个不在表范围内的实例(test[4]不存在).

但是,它仍然会调用tellname()它调用它的实例不存在.它只是认为它的_name领域是空的.

这怎么可能?

edm*_*dmz 5

它只是未定义的行为,C++没有任何要求,所以"任何事情都可能发生".你所看到的只是一个巧合,毫无价值的理由:下次你运行它可能会崩溃,显示nyan cat等等.