#include <iostream>
using namespace std;
class First{
public:
void fun()
{
cout<<"base fun called\n";
}
};
class Second{
public:
static First x; //Line 1
static First *y; //Line 2
};
First Second::x; //Line 3
First* Second::y; //Line 4
int main()
{
Second::x.fun();
Second::y->fun();
return 0;
}
第1行和第2行是声明,第3行和第4行是定义,我从其他一些有关静态成员的stackoverflow帖子中了解到这一点。
Q1。为什么我们必须定义这样的静态对象? (第3行和第4行)
Q2。 x和y之间有什么区别?(第1行和第2行)
Q3。为x和y对象分配的内存在哪里?(第3行和第4行)
答案 0 :(得分:6)
您的y
是pointer(不是对象 - 指针与它指向的对象不同)。由于它是static
,因此会使用nullptr
进行初始化,除非您明确将其初始化为其他内容(例如,有一些First z;
对象并定义{{1} }})。
所以First* Second::y= &z;
取消引用空指针,即undefined behavior。你真的应该是very scared。
我们无法回答您的所有问题(需要整本书,指针及其semantics的概念很难解释,并且与pointer aliasing有关;请阅读{{3} }})。因此,花几周时间阅读一些好书,如virtual address space;你也可以通过阅读Programming - Principles and Practice Using C++&amp; SICP(即使两者都不是关于C ++;但两者都与编程有关,即Introduction to Algorithms)。
另请参阅一些优秀的difficult to learn网站,它提供了有关C++ reference的简短说明。
请注意,使用原始指针通常(但并非总是)是真正的C ++ 11中的难闻气味。您可能应该考虑使用static
class members,但是YMMV。
答案 1 :(得分:3)
1)因为当创建一个类的对象时,将没有为他们的静态成员分配内存 - 所以第1行和第2行声明应该有这样的成员,但是第3行和第3行。 4 define 应分配内存的地方。
2)确实没有太大的区别 - x
和y
只是类Second
的成员,但是类型不同。 x
的类型为First
,其大小等于First
成员的总和。 y
的类型为First*
- 其大小取决于特定编译器中使用的指针大小。
3)静态成员的内存分配已经有good answer。最常见的实现是使用程序的data segment。
答案 2 :(得分:2)
<强> Q1 强>
当您编写class
语句时,通常是声明。没有实际数据成员在任何地方分配。对于非静态成员,定义在实例化时,在调用构造函数时进行。
但是,静态成员与实例化无关。它们应该分配一次,你应该决定在哪里。这就是实际定义的原因。该文件(编译时)将负责实际分配这些成员。
这实际上也回答了 Q3 。至于 Q2 ,我不确定究竟是什么问题。