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代码。