C++ 类的函数可以通过指针访问而不创建实际对象吗?

C++ 类的函数可以通过指针访问而不创建实际对象吗?,c++,class,pointers,object,C++,Class,Pointers,Object,我正在执行以下代码: #include <iostream> using namespace std; class B { public: int a; void display() { a=10; cout<<"Content of base class.\n"; } }; int main() { B *b,b1,b2; char *a=new

我正在执行以下代码:

#include <iostream>
using namespace std;
class B
{
    public:
        int a;
       void display()
         { 
             a=10;
             cout<<"Content of base class.\n"; }
};
int main()
{
    B *b,b1,b2;
    char *a=new char[1];
    *a='A';
    if(b==NULL)
    {
        cout<<(*(int*)a)<<endl;
    }
    b->display();
    b1.display();
    b2.display();
    b->a=60;
    b1.a=40;
    b2.a=50;
    cout<<b->a<<endl<<b1.a<<endl<<b2.a;
    return 0;
}
据我所知,对于创建的每个对象,都会分配一些空间,并将该对象的数据存储在那里(这里是b1和b2).但在这段代码中,b只是一个指针,它仍然能够访问b类的函数和变量,它甚至没有指向b类的任何对象。b是空的,如if语句所示。我对此感到困惑

现在我还想知道b->a(其值为60)存储在哪里?比如b1和b2中会有40和50

另外,如果只有指针足以调用函数,那么每次都需要创建对象吗

b->display()产生未定义的行为。这意味着,无论你的电脑在那一刻做什么都已经足够好了

存储
b->a
的位置问题毫无意义,因为访问
b->a
会产生未定义的行为

在某些情况下,C++没有义务告诉你你把它搞砸了。取消对未初始化内存的指针引用就是这种情况。

b->display()产生未定义的行为。这意味着,无论你的电脑在那一刻做什么都已经足够好了

存储
b->a
的位置问题毫无意义,因为访问
b->a
会产生未定义的行为


在某些情况下,C++没有义务告诉你你把它搞砸了。取消对未初始化内存的指针引用就是这种情况。

这是未定义的行为。您收到的输出,以及程序没有崩溃的事实,都是巧合


如果不需要对象,请使用静态或独立函数。

这是未定义的行为。您收到的输出,以及程序没有崩溃的事实,都是巧合


如果您不需要对象,请使用静态或独立函数。

考虑到您的运行情况,您将获得:

$ ./b
Segmentation fault (core dumped)
实际上,在编译时:

$ g++ -Wall B.cpp -o b
B.cpp: In function ‘int main()’:
B.cpp:11:5: warning: ‘b’ may be used uninitialized in this function [-Wmaybe-uninitialized]
     if(b==NULL)
     ^
它是未定义的行为。您得到了输出,因为VisualStudio (这就是我认为您要使用的),正在优化以使用您的前一个堆栈,并且您将进入内存中实际拥有某些内容的相同位置

但这是完全错误的

是的,“每次都要创建对象”


更新:@codecracker说这种行为也在
gcc
上!(奇怪)

考虑到你的跑步情况,你会得到:

$ ./b
Segmentation fault (core dumped)
实际上,在编译时:

$ g++ -Wall B.cpp -o b
B.cpp: In function ‘int main()’:
B.cpp:11:5: warning: ‘b’ may be used uninitialized in this function [-Wmaybe-uninitialized]
     if(b==NULL)
     ^
它是未定义的行为。您得到了输出,因为VisualStudio (这就是我认为您要使用的),正在优化以使用您的前一个堆栈,并且您将进入内存中实际拥有某些内容的相同位置

但这是完全错误的

是的,“每次都要创建对象”


更新:@codecracker说这种行为也在
gcc
上!(奇怪)

您正在观察到未定义行为的行为方式出乎您的意料。作为建议。。。移动到Linux。。。你会学得更快,正确的方法是:-)@azbarcea:因为使用Linux会自动让你写出好代码?我对此表示怀疑。建议是使用命令行工具。您正在观察到未定义的行为的行为方式出乎您的意料。作为建议。。。移动到Linux。。。你会学得更快,正确的方法是:-)@azbarcea:因为使用Linux会自动让你写出好代码?我对此表示怀疑。建议应该使用命令行工具。我认为 IoStult是C++(因此G++)而不是C。C将是<代码>包含< /COD>。所以您应该使用g++而不是gcc。我给你+1,因为你说你不使用Visual Studio:)@azbarcea:“GCC”只是一个集合名称。它并不意味着你编译C代码。我认为 IoSturis/Cuff>是C++(因此G++)而不是C。所以您应该使用g++而不是gcc。我给你+1,因为你说你不使用Visual Studio:)@azbarcea:“GCC”只是一个集合名称。这并不意味着你要编译C代码。