声明静态对象和指向静态对象的指针之间的区别

时间:2016-11-27 08:50:28

标签: c++ static-members

    #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行)

3 个答案:

答案 0 :(得分:6)

您的ypointer(不是对象 - 指针与它指向的对象不同)。由于它是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)确实没有太大的区别 - xy只是类Second的成员,但是类型不同。 x的类型为First,其大小等于First成员的总和。 y的类型为First* - 其大小取决于特定编译器中使用的指针大小。

3)静态成员的内存分配已经有good answer。最常见的实现是使用程序的data segment

答案 2 :(得分:2)

<强> Q1 当您编写class语句时,通常是声明。没有实际数据成员在任何地方分配。对于非静态成员,定义在实例化时,在调用构造函数时进行。 但是,静态成员与实例化无关。它们应该分配一次,你应该决定在哪里。这就是实际定义的原因。该文件(编译时)将负责实际分配这些成员。

这实际上也回答了 Q3 。至于 Q2 ,我不确定究竟是什么问题。