函数指针以及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变量