标题:关于静态成员函数的一个问题,请大佬帮我看看。
只看楼主
Theblueman
Rank: 1
等 级:新手上路
帖 子:25
专家分:0
注 册:2018-3-11
结帖率:60%
 问题点数:0 回复次数:7 
关于静态成员函数的一个问题,请大佬帮我看看。
#include<iostream>
#include<string.h>
using namespace std;
class student
{
private:
    static int total;
    int num;
    char name[20];
public:

    student(){total++;}
    ~student(){total--;}
    student(int n,const char *p="wang");
    void getname();
    int getnum();
    static void Print();
};
int student::total=0;
student::student(int n,const char *p)
{
    num=n;
    strcpy(name,p);
    total++;
}
void student::getname()
{
    cout<<name<<endl;
}
int student::getnum()
{
    return num;
}
void student::Print()
{
    cout<<"The number of all students:"<<total<<endl;
}
int main()
{
    student::Print();
    student *P=new student(13);
    student::Print();
    P->Print();
    delete P;
    P->Print();         //????????          
    student s[2];
    student::Print();
    s[1].Print();
      return 0;
}
问:为什么对象指针P被释放后,还能正确调用静态成员函数?      
搜索更多相关主题的帖子: 成员 函数 student int Print 
2018-04-09 15:05
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:0 
首先,你这是 static成员,P->Print()其实就是student::Print(),与P是什么值毫无关系。

再者,即使Print不是static成员,P->Print()也是可以调用的,只要不存取P指向的成员。
2018-04-09 15:25
Jonny0201
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:52
帖 子:488
专家分:2603
注 册:2016-11-7
得分:0 
static 属于所有同类别共用, 和删不删除指针没有关系

已经删除的指针仍然可以访问到数据, 这个要看具体的编译器, 在某些编译器上, 即时你已经释放了, 仍然可以通过已经释放的地址访问到原来存储的数据
这是因为指针被释放了, 而数据并没有从相关内存上清除
但是这种行为属于严重的程序设计错误, 在 C++ 中, 访问已经释放的指针是未定义行为, 不同的编译器可能有不同的处理方法
你现在的编译器可以正常输出, 不代表你这段代码到了别的编译器上也可以正常输出


[此贴子已经被作者于2018-4-9 18:11编辑过]

2018-04-09 18:09
Theblueman
Rank: 1
等 级:新手上路
帖 子:25
专家分:0
注 册:2018-3-11
得分:0 
回复 3楼 Jonny0201
哦,明白了,谢谢(能顺便问一下截图里使用的是什么软件吗?)

低头编程,用心学习!
2018-04-09 21:59
Theblueman
Rank: 1
等 级:新手上路
帖 子:25
专家分:0
注 册:2018-3-11
得分:0 
回复 2楼 rjsp
用dev试了一下,确实可以,但是最后一句“只要不存取P指向的成员”还是不清楚(是给P赋值吗?)

低头编程,用心学习!
2018-04-09 22:04
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:0 
回复 5楼 Theblueman
#include <iostream>
using namespace std;

class foo
{
public:
    foo() : val()
    {
    }

    void bar()
    {
        cout << this << endl;
    }

private:
    int val;
};

int main( void )
{
    foo* p = NULL;
    p->bar();

    return 0;
}

2018-04-10 08:24
Theblueman
Rank: 1
等 级:新手上路
帖 子:25
专家分:0
注 册:2018-3-11
得分:0 
回复 5楼 Theblueman
静态与非静态的最关键的区别就是那个this指针(看了csdn的博客)

低头编程,用心学习!
2018-04-10 12:56
Jonny0201
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:52
帖 子:488
专家分:2603
注 册:2016-11-7
得分:0 
回复 4楼 Theblueman
CLion
2018-04-10 14:02



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-485889-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.160028 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved