icp备案网站php主做哪种类型网站
2025/12/25 8:39:30 网站建设 项目流程
icp备案网站,php主做哪种类型网站,wordpress主题修改导航链接,怎么把安装的字体导入wordpressWelcome to 9ilks Code World (๑•́ ₃ •̀๑) 个人主页: 9ilk (๑•́ ₃ •̀๑) 文章专栏#xff1a; C 本篇博客主要是对C/C中类型转换的梳理总结。 内置类型转换 在C语言中#xff0c;如果赋值运算符左右两侧类型不同#xff0c;或者形参与实参类型不匹…Welcome to 9ilks Code World(๑•́ ₃ •̀๑)个人主页:9ilk(๑•́ ₃ •̀๑)文章专栏 C本篇博客主要是对C/C中类型转换的梳理总结。内置类型转换在C语言中如果赋值运算符左右两侧类型不同或者形参与实参类型不匹配或者返回值类型与 接收返回值类型不一致时就需要发生类型转化C语言中总共有两种形式的类型转换隐式类型 转换和显式类型转换。1. 隐式类型转换编译器在编译阶段自动进行能转就转不能转就编译失败通常是在整形之间/整形和浮点数之间。2. 显示类型转换需要用户自己处理通常是在指针和整形、指针之间发生。//隐式类型转换 整形家族 整形与浮点型 size_t t 21; double d 21; printf(%d,%f\n, t, d); //强制类型转换 不同类型的指针之间 指针与整形 double* pd d; int* pi (int*)pd; int o (int)pi;我们可以看到对于这两种类型转换转换的可视性比较差所有的转换形式都是以一种相同形式书写难以跟踪错误的转换。内置类型转换为自定义类型内置类型转换为自定义类型需要在自定义类型提供对应的构造函数这样才能进行单参和多参的隐式类型转换此时会产生临时对象再用这个临时对象构造编译器不优化时class A { public: A(int a) :_a1(a) , _a2(a) { cout A(int a) endl; } A(int a1, int a2) :_a1(a1), _a2(a2) { cout A(int a1, int a2) endl; } A(const A) { cout A(const A) endl; } private: int _a1 1; int _a2 1; }; int main() { //单参和多参的隐式类型转换 A aa1 1; A aa2 {1,2}; const A aa3 {2,2};//隐式类型产生临时对象 return 0; }自定义类型转为内置类型自定义类型可以通过内置类型转换为内置类型需要注意的是operator 类型类型转换符实现是没有返回类型的class B { public: B() {} operator int() { return _a1 _a2; } private: int _a1 1; int _a2 1; }; int main() { B b1; int x b1.operator int(); int y b1; return 0; }我们可以看到语法层面不管你是否显示调用operator int底层都是转换成函数调用对于y这种其实是隐式类型转换的写法我们可以用explicit关键字验证下它能让禁止编译器禁止隐式类型转换自定义类型之间的转换类型转换之间需要关联性之前的显示和隐式就是关联性强弱的问题这里自定义类型之间的转换也一样需要对应构造函数支持class A { public: A(int a) :_a1(a) , _a2(a) { cout A(int a) endl; } A(int a1, int a2) :_a1(a1), _a2(a2) { cout A(int a1, int a2) endl; } A(const A) { cout A(const A) endl; } int get() const { return _a1 _a2; } private: int _a1 1; int _a2 1; }; class B { public: B() {} B(const A aa) :_a1(aa.get()) { cout B(const A aa) endl; } explicit operator int() { return _a1 _a2; } private: int _a1 1; int _a2 1; }; int main() { A aa1(1); B bb1 aa1; const B ref aa1; return 0; }下面我们看这样的一个场景typedef _list_iteratorT,T,T* iterator; typedef _list_iteratorT,const T,const T* const_iterator; zlist::listint it {1,2,3,4}; zlist::listint::const_iterator cit it.begin();这里将一个普通迭代器赋值给const迭代器类型这里会报错但是注意报错原因不是权限缩小因为只有指针引用采用权限问题这里的原因是两种迭代器是同一个类模板参数传不同的模板参数产生的不同类型因此这里it对应的是普通迭代器与const迭代器类型不匹配也就是说这里其实是个类型转换问题。此时就可以函数来实现自定义类型之间的转换我们需求是普通迭代器转换成const迭代器,因此我们写个对应的构造函数即可当传参传的是普通迭代器时这里相当于是个普通构造函数ListIterator(const ListIteratorT, T, T* it) :_node(it._node) { cout ListIterator(const ListIteratorT, T, T* it) endl; }C中的类型转换标准C为了加强类型转换的可视性引入了四种命名的强制类型转换操作符 static_cast、reinterpret_cast、const_cast、dynamic_caststatic_caststatic_cast用于非多态类型的转换静态转换编译器隐式执行的任何类型转换都可用 static_cast但它不能用于两个不相关的类型进行转换int a 20; double d static_castint(a); //对标隐式类型转换reinterpret_castreinterpret_cast操作符通常为操作数的位模式提供较低层次的重新解释用于将一种类型转换为另一种不同的类型用于两个不相关类型之间的转换int* pa a; double* pd reinterpret_castdouble*(pa);//对标显示类型转换const_castconst_cast最常用的用途就是删除变量的const属性方便赋值它对应的是强制类型转换中有风险的去掉const属性const int a 2; int* p (int*)a; int* p2 const_castint*(a); *p 3;我们打印看下结果cout a endl; //2 cout *p2 endl; //3由于a本身是const int因此在编译期就把它优化为一个立即数2不再去内存里取值此时我们要想它读的是最新的可以加上volatile关键字修饰告诉编译器每次从内存中读取最新的volatile const int a 2; int* p (int*)a; int* p2 const_castint*(a);dynamic_castdynamic_cast用于将一个父类对象的指针/引用转换为子类对象的指针或引用(动态转换)向上转型子类对象指针/引用-父类指针/引用(不需要转换赋值兼容规则)向下转型父类对象指针/引用-子类指针/引用(用dynamic_cast转型是安全的)毕竟子类比父类多一部分成员的话你访问会造成越界注意1. dynamic_cast只能用于父类含有虚函数的类因为运行时类型检测需要运行时的类型信息而这个信息是存储在虚函数表中的只有定义了虚函数的类才有虚函数表。2. dynamic_cast会先检查是否能转换成功能成功pc指向子类对象则转换不成功pc指向父类对象则返回NULLclass A { public: virtual void f() {} int _a 1; }; class B : public A { public: int _b 2; }; void fun(A* pa) { // dynamic_cast会先检查是否能转换成功(指向子类对象)能成功则转换 // (指向父类对象)不能则返回NULL B* pb1 dynamic_castB*(pa); if (pb1) { cout pb1: pb1 endl; cout pb1-_a endl; cout pb1-_b endl; pb1-_a; pb1-_b; cout pb1-_a endl; cout pb1-_b endl; } else { cout 转换失败 endl; } } int main() { A a; B b; fun(a); fun(b); return 0; }注意强制类型转换关闭或挂起了正常的类型检查每次使用强制类型转换前程序员应该仔细考虑是 否还有其他不同的方法达到同一目的如果非强制类型转换不可则应限制强制转换值的作用 域以减少发生错误的机会。强烈建议避免使用强制类型转换。RTTIRTTIRun-time Type identification的简称即运行时类型识别。C通过以下方式来支持RTTI1. typeid运算符2. dynamic_cast运算符3. decltype

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询