可以通过指针访问类的函数,而无需创建实际的对象吗?

时间:2015-07-19 17:47:26

标签: 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 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;
}

它提供以下输出:

65
Content of base class.
Content of base class.
Content of base class.
60
40
50

根据我的知识,每个创建的对象都会分配一些空间,并且该对象的数据存储在那里(这里是b1和b2)。但是在这段代码中,b只是一个指针,它仍然可以访问函数和变量B类,它甚至没有指出任何类Bb的对象是NULL,如if语句所示。我对此感到困惑!!!

现在我还想知道b-&gt; a(其值为60)的存储位置?如b1和b2中的40和50就好。

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

3 个答案:

答案 0 :(得分:3)

未定义的行为。你收到的输出,以及程序没有崩溃的事实,只不过是巧合。

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

答案 1 :(得分:2)

b->display();会产生未定义的行为。这意味着,无论你的计算机在那一刻做什么都足够了。

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

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

答案 2 :(得分:0)

考虑到你在那里运行你所拥有的东西:(统一差异:http://hastebin.com/midocuqiki),你会得到:

$ ./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)
     ^

未定义的行为。你得到了那个输出,因为Visual Studio (以及我认为你使用的那个),正在优化使用你之前的堆栈,并且你会在你真正有东西的内存中找到相同的位置。

但是完全错了!

&#34;每次创建对象都非常必要&#34;

更新:@codecracker表示此行为也在gcc上! (怪异)