C++
-
类型转换构造函数、
-
通过转换构造函数和类型转换运算符来做到类型转换、
-
主要功能是将其它类型的数据转换成该类类型的对象、
-
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; }
-
-