类型转换构造函数、
通过转换构造函数和类型转换运算符来做到类型转换、
主要功能是将其它类型的数据转换成该类类型的对象、
class t
{
public:
//explicit//禁止隐式类型转换
explicit t(int x = 0) :m(x)//类型转换构造函数、可以将一个整型(int)转换成类类型(t)
{
if (m < 0)m = 0;
if (m > 50)m = 50;
}
int m;//定义成员变量、
};
int main()
{
t ta = 10;//隐式类型转换、将10转换成t的对象、调用类类型转换构造函数、加上explicit显示错误、
t tb(20);//虽然调用了类型转换构造函数、但是没有进行隐式类型转换、加上explicit未显示错误、
只有一个参数、参数不是本类的const引用、是待转换的数据类型、
类型转换运算符(类型转换函数)
显示类型转换运算符、
类对象转换为函数指针、
能力和类型转换构造函数相反、
特殊的成员函数、能将一个类类型对象转换成其它数据类型、
operator type()const——类型转换运算符、括号内为空
const可选、const表示一般不应该改变转换对象内容、但不是必须有const、
type 表示要转换成的某种类型、只要能够作为函数返回的类型都是可以的、(数组指针、函数指针、引用等均可)
类型转换运算符没有形参、因为一般都是隐式执行、也没办法传递、同样也无法指定返回类型、可以正常的返回type指定的值、
必须定义为类的成员函数、
class t
{
typedef void (*tt)(int);//定义函数指针类型、带有一个形参、没有返回类型
public:
static void mc(int v)//静态的成员函数、不依赖对象依赖于类、
{
int te;
te = 5;
}
operator tt()//新的类型转换运算符、将本类类型对象转换成一个函数指针、
{
return mc;//必须要返回一个函数指针、函数地址(函数名)便可作为函数指针的返回类型、
}
public:
t(int x = 0) :m(x)//
{
if (m < 0)m = 0;
if (m > 50)m = 50;
}
operator int() const//类型转换运算符、
{
return m;
}
int m;//定义成员变量、
};
int main()
{
t ta= 10;
t tb=60;//编译器用60生成临时的t对象(调用t类型转换构造函数)、又调用赋值运算符将临时对象的内容给了tb
//int k = tb + 20;//隐式调用
int k = static_cast<int>(tb) + 20;//显示强制类型转换符、
int k1 = tb.operator int () + 5;//显示调用、没有形参、
t mi (12);
mi(12);//调用类型转换运算符、转换成函数指针类型、返回函数地址、 有函数地址后再去调用静态成员函数、
}
类型转换的二义性问题、
类成员函数指针、
指向类成员函数的指针、
普通成员函数、
声明普通成员函数指针
获取类成员函数地址
使用函数指针——类对象名.*函数指针变量名、如果是对象指针则是指针名->函数指针变量名
class c
{
public:
void pc(int te)
{
cout<<"pc普通函数调用"<<te<<endl;
}
virtual void vc(int te)
{
cout << "vc虚函数调用" << te << endl;
}
static void sc(int te)
{
cout << "sc静态函数调用" << te << endl;
}
};
int main()
{
void (c:: * mt)(int);//定义类成员指针变量、成员函数是属于类的、不属于对象、只有类就有成员函数地址、
mt = &c::pc;//要使用成员函数指针就必须绑定到一个类对象上才能调用、
c ca,* pt;
pt = &ca;
(ca.*mt)(20);//针对ca对象的成员函数、
(pt->*mt)(20);//调用指针对象
}
虚函数、
void (c:: * ml)(int) = &c::vc;
(ca.*ml)(10);
(pt->*ml)(20);
静态成员函数、
void (*mc)(int) = &c::sc;
mc(40);//直接调用
类成员变量指针、
普通成员变量、
不是真正意义上的指针、指向的并非是地址、指向的是成员变量、于类对象指针之间的偏移量、
类中有虚函数的话就会生成虚函数表、虚函数表是属于类、和对象没有关系、
class c
{
public:
int ma;//普通成员变量、
};
int main()
{
int c::*mp = &c::ma;//直接定义类成员变量指针
c ct;
ct.*mp = 70;//通过类成员变量指针来修改成员变量值、 相当于是mp=70、
}
静态成员变量、
属于类、是真正的地址、
class c
{
public:
static int msa;//静态成员变量属于类、
};
int c::msa = 5;//定义静态成员变量
int main()
{
int* sp = &c::msa;
*sp = 123;
}
原文:https://www.cnblogs.com/chengyaohui/p/13860716.html