- 指向成员函数的指针
定义:void (Time::*p)();//定义一个指针未初始化,必须指明所属类名。
初始化:p = &Time::display;//p指向display这个函数
调用:(t1.*p)();
实现:
#include<iostream>
using namespace std;
class human_;
class human {
private:
int age;
string name;
public:
void get_() {
cin >> age >> name;
}
void display(human_&);
};
class human_{
private:
string add;
public :
void get_1() {
cin >> add;
}
friend void human::display(human_ &);
};
void human::display(human_& x){
cout << x.add << endl;
cout << age <<" " << name << endl;
}
int main() {
human hum;
//hum.get_();不带参
void (human:: * p)();
p = &human::get_;
(hum.*p)();
human_ hum_;
hum_.get_1();
//hum.display(hum_);以下为带参
void (human:: * pp)(human_&);
pp = &human::display;
(hum.*pp)(hum_);
}
- 常对象
定义:const Time t1 = (1,2,3);或 Time const t1 = (1,2,3);(Time 是类名 ,t1是新定义的对象名)。
特性:①常对象是不可以调用普通成员函数的,只可以调用常成员函数,但常成员函数中不可有修改数据的语句。
②常成员函数是常对象对外的为一出口。
③常对象必须要有初值。
④对象中的所有数据成员的值都不可改变
何时采用常对象:
当一个对象中的所有数据成员都不可被修改时,则可定义一个常对象,定义完之后,用常成员函数调用对象中的数据成员。
若该对象中只有一部分的数据是需要不被更改的,则定义这部分的数据为常变量(不需要定义常对象),接着,可定义非const成员函数(普通成员函数)调用这些数据。
实现:
#include<iostream>
using namespace std;
class human {
private:
int age;
string name;
public:
void get_() {
cin >> age >> name;
}
void dis() const{
cout << "constA" << endl;
}
};
int main() {
const human hum_1;//定义常对象
hum_1.get_();//报错 常对象是不可以调用非const成员函数的
hum_1.dis();//常成员函数是常对象对外的唯一接口
}
- 常数据成员
-
常数据成员
定义:const int t1;//与普通的常变量相似,其数据不可被改变。
特性:①只可通过构造函数的参数初始化表对常数据成员进行初始化,任何其他函数都不能对常数据成员赋值。 -
常成员函数
定义:void Time::display() const(类体内Time::则不需要写)
类型名 函数名(参数表)const
特性:①常成员函数是不可调用另一个非const成员函数,因为如果可以了,则改变了常成员函数的属性,它自身是不能存在修改变量值的语句的,但是非const成员函数该函数之中是可以写修改变量数值的语句的。
② 常成员函数可以引用const成员变量,也可以引用非const成员变量。但是均不可改变数值大小。
③const成员变量既可以被const成员函数调用也可被非const成员函数调用,但是数值不可被改变。
实现:
# include <iostream>
using namespace std;
class person {
string name;
string sex;
const int id;
public:
person() :id(0) {
name = " ";
sex = " ";
}
void get_() {
//cin >> name >> sex >> id;//错误 常成员变量只能通过参数表构造函数初始化
cin >> name >> sex;
}
void display() const{
cout << name << " " << sex << ' ' << id << endl;//常成员函数中既可以调用普通变量也可以调用常成员变量
}
void cou_() {
cout << id;//常成员变量可被普通成员函数引用
cout << "constA" << endl;
}
};
int main() {
}
- 指向对象的常指针
定义:Tiem*constp = &p1;
关键:常指针,该指针自身的内容(存放的地址)是不可改变的,也就是指针始终指向一个东西,但不表示指针所指向的变量或者对象不能改变其数值。
int main() {
person p1;
person *const p = &p1;//定义是对const修饰的变量必须初始化
}
用途:常用来作为形参,表示不改变指向始终指向原来的对象。
实现指向对象的常指针作为形参:
# include <iostream>
using namespace std;
class person {
string name;
string sex;
const int id;
public:
person() :id(0) {
name = " ";
sex = " ";
}
void get_() {
//cin >> name >> sex >> id;//错误 常成员变量只能通过参数表构造函数初始化
cin >> name >> sex;
}
void cout_(person *const p) {//指向对象的常指针作为形参
cout << p->id << endl;
}
};
int main() {
person pp;
pp.get_();
pp.cout_(&pp);
}
- 指向常对象的指针变量
定义:const person *p
关键:指向常对象的指针,它自身是与一般的指针没有什么区别,关键在于他指向的是一个常对象(或者其他变量),也就是说,其数据成员不可修改,但是指针的指向是可以改变的。
特性:①指向常对象的指针,也可以指向普通变量,但此时不可通过该指针修改普通变量的值,因为此时使用该指针访问该变量,改变了具有了常变量不可改变的属性。
②当定义形参为指向常变量的指针时,实参可以是普通的,也可以是const的。
③一个常对象(变量),可以指向它的只有指向常对象的指针,而普通指针是不可以的(非法)。 - 常引用
定义:const person&x = pp;
如果不希望在函数中修改实参pp的值 就可以把形参x声明为常引用,
常引用经常作为形参,可保证实参不被修改,保证数据的安全。