函数指针以及const

2019-03-16  本文已影响0人  青椒rose炒饭

先看程序吧,下面我给出程序的解释.

1,普通的函数指针

#include "iostream"
using namespace std;
void show()
{
    cout<<"kmust"<<endl;
}
int main()
{
    void (*p )(); //函数指针 
    p = &show;//函数首地址,函数名就是首地址 
    p();//运行show () 
}

函数在内存里也是按地址存储的,存储在程序段,一般函数名就是首地址,函数指针的定义 void (p)(),前面的void 是show函数的返回值类型,指针p,后面的括号说明是一个函数指针.调用直接加 "()" 就调用了show函数.运行结果

普通的函数指针: 返回值类型 (*变量名)()

运行结果.png

2,指向类成员函数的指针

指向类的成员函数的指针:返回值类型 (类名::变量名)()

#include "iostream"
#include "string.h"
#include "student.h"
using namespace std;
class Student
{
    private :
        int num;
        char name[20];
    public :
        Student(int,char[]);//函数申明可以没有变量名 
        void show();    
};
Student::Student(int num,char name[])
{
    this->num = num;
    strcpy(this->name,name);    //字符串拷贝函数 
}
void Student::show()
{
    cout<<"学号:"<<num<<endl;
    cout<<"名字:"<<name<<endl;
}
int main()
{
    Student s(007,"kmust");//调用构造函数初始化 
    void (Student:: *p) ();
    p=&Student::show; //使用函数名首地址 
    (s.*p)(); //运行show()函数 
    return 0; 
}

仔细想一想还是没有那么难以理解的 void (Student:: p) (); void 也是show的返回值类型,Student:: 表示指向的函数在Student类里, ()表示是函数指针. 赋值使用函数名取首地址赋值 .(s.p)(); *是取内容,此句相当于s.show().

运行结果

3,类中const修饰的常量,常函数

const 修饰的变量不能修改值,常对象需要调用公共成员函数需要在函数后面加上const,如果存在数据成员为常数据成员则,需要使用参数初始化列表进行初始化,不能使用构造函数.

#include "iostream"
#include "string.h"
#include "student.h"
using namespace std;
class Student
{
    private :
        const int num;//常量只能使用参数列表赋值 
        string name;
    public :
        Student():num(007),name("kmust"){};//使用参数列表为num和name赋值 
        void show() const;  
};
void Student::show() const
{
    cout<<"学号:"<<num<<endl;
    cout<<"名字:"<<name<<endl;
}
int main()
{
    const Student s;
//s常对象,想要调用公共函数必须公共函数 申明和定义后面都加const    
    s.show();//常对象调用公共函数 
    return 0; 
}

常变量只能使用常指针指向它,非const指针却能指向常量或非const变量

上一篇下一篇

猜你喜欢

热点阅读