当前位置: 首页 > news >正文

仙桃网站制作抚顺网络推广

仙桃网站制作,抚顺网络推广,网络科技公司取名创意,临沂企业建站效果好一、特殊类设计 1.1 不能被拷贝的类 拷贝只会放生在两个场景中#xff1a;拷贝构造函数以及赋值运算符重载#xff0c;因此想要让一个类禁止拷贝#xff0c;只需让该类不能调用拷贝构造函数以及赋值运算符重载即可。 C98#xff1a; 1、将拷贝构造函数与赋值运算符重载只… 一、特殊类设计 1.1 不能被拷贝的类 拷贝只会放生在两个场景中拷贝构造函数以及赋值运算符重载因此想要让一个类禁止拷贝只需让该类不能调用拷贝构造函数以及赋值运算符重载即可。 C98 1、将拷贝构造函数与赋值运算符重载只声明不定义。防自己人 不定义是因为该函数根本不会调用定义了其实也没有什么意义不写反而还简单而且如果定义了就可能导致成员函数进行内部拷贝了。 2、并且将其访问权限设置为私有即可。防外人 如果只声明没有设置成private用户自己如果在类外定义了就可以不能禁止拷贝了 class CopyBan { // ... private: CopyBan(const CopyBan c); CopyBan operator(const CopyBan c); //... }; C11: C11扩展delete的用法delete除了释放new申请的资源外如果在默认成员函数后跟delete表示让编译器删除掉该默认成员函数。 class CopyBan { // ... CopyBan(const CopyBan c)delete; CopyBan operator(const CopyBan c)delete; //... }; 1.2 只能在堆上创建对象的类 思路1 1. 将类的构造函数私有拷贝构造声明成私有可以直接delete掉。防止别人调用拷贝在栈上生成对象。 注意拷贝构造可以直接delete掉但是构造函数不行因为我们还需要利用构造函数在堆上创建对象。2. 提供一个静态的成员函数在该静态成员函数中完成堆对象的创建。 注意这里涉及到的是先有鸡还是先有蛋的问题因为如果不去创建这个对象就没有办法去调用他的构造函数但是没有调用构造函数就没有办法创建对象。所以这里必须通过静态成员函数的返回值去构造堆对象。 class HeapOnly { public:static HeapOnly* CreateObject(){return new HeapOnly;} private:HeapOnly(){};HeapOnly(const HeapOnly) delete; };int main() {HeapOnly*p HeapOnly::CreateObject();return 0; } 思路2 1、相比较于上一种思路把构造函数私有、拷贝构造delete也可以选择将析构函数给设成私有。 析构函数设置成私有同样会导致对象无法在栈上进行创建。因为自定义类型在栈帧中销毁的时候会去自动调用他的析构函数但是因为调不到所以会报错。 2、封装一个destory的成员函数这样我们可以手动释放堆空间的资源。 在堆上创建对象是用指针去接受所以并不影响但是内存需要我们去手动释放因此我们需要封装destory的成员函数去调用delete这样delete可以对应调用到析构函数。 这里有两个方案一种是设置能静态成员函数类域调用一种是设置成普通成员函数对象自己调用。 class HeapOnly { public://方案1 static void Destroy(HeapOnly* hp){delete hp;}//方案2void Destroy(){delete this;} private:~HeapOnly() {}; };int main() {//HeapOnly H; 调不到析构函数无法创建//静态成员函数释放HeapOnly* ptr new HeapOnly;HeapOnly::Destroy(ptr);//普通成员函数释放HeapOnly* ptr2 new HeapOnly;ptr2-Destroy();return 0; } 1.3 只能在栈上创建对象的类 1、new和delete是全局的运算符重载函数因此我们只要将这两个给禁用掉就不会在堆上创建对象。 需了解具体声明void* operator new(size_t size) 和 void operator delete(void* p) 。实现类专属的operator new和delete 这样new这个类对象时operator new就会调用这个不会调全局的。 class StackOnly{public:static StackOnly CreateObj(){return StackOnly();}// 禁掉operator new可以把下面用new 调用拷贝构造申请对象给禁掉// StackOnly obj StackOnly::CreateObj();// StackOnly* ptr3 new StackOnly(obj);void* operator new(size_t size) delete;void operator delete(void* p) delete;private:int _a;};int main(){StackOnly obj;//StackOnly* s new StackOnly;} 但是没有办法去禁用C语言的相关函数。  1.4 不能被继承的类 C98 构造函数私有化这样子类调用不到父类的构造函数无法实现继承 class NonInherit { public: static NonInherit GetInstance() { return NonInherit(); } private: NonInherit() {} }; C11 直接用final关键字可以使得该类无法被继承 class A final { // .... }; 1.5 控制可创建对象数量的类 设置一个静态int变量count每创建一个对象就--count class singleclass { public:static singleclass* getsingleclass(){if (count 0){count--;return new singleclass();}else{cout 实例化失败 endl;return nullptr;}} private:static int count;singleclass() {}; }; int singleclass::count 1;int main() {singleclass* s1 singleclass::getsingleclass();singleclass* s2 singleclass::getsingleclass(); } 二、类型转换 2.1 C语言中的类型转换 在C语言中如果赋值运算符左右两侧类型不同或者形参与实参类型不匹配或者返回值类型与接收返回值类型不一致时就需要发生类型转化C语言中总共有两种形式的类型转换隐式类型转换和显式类型转换。 1、隐式类型转换编译器在编译阶段自动进行能转就转不能转就编译失败。相近类型才可以进行隐式类型转换 比如int和double 他们本质上都是表示数据的大小。 int i 1; // 隐式类型转换 double d i; double di 首先会产生一个double类型的临时对象接收i然后将临时对象拷贝给d。 2、显式类型转化需要用户自己处理。需要有一定的关联性。比如int和int* int i 1; int* p i; // 显示的强制类型转换 int address (int)p; printf(%x, %d\n, p, address); return 0; 缺陷转换的可视性比较差所有的转换形式都是以一种相同形式书写难以跟踪错误的转换 2.2 C中的类型转换 标准C为了加强类型转换的可视性引入了四种命名的强制类型转换操作符 2.2.1 static_cast static_cast用于非多态类型的转换静态转换编译器隐式执行的任何类型转换都可用相近类型用static_cast-意义相似的类型 int main() {double d 12.34;int a static_castint(d);cout a endl;return 0; } 2.2.2 reinterpret_cast reinterpret_cast操作符通常为操作数的位模式提供较低层次的重新解释用于将一种类型转换为另一种不同的类型一定的关联但是意义不相似的的类型用reinterpret_cast int main() {double d 12.34;int a static_castint(d);cout a endl;// 这里使用static_cast会报错应该使用reinterpret_cast//int *p static_castint*(a);int* p reinterpret_castint*(a);return 0; } 2.2.3 const_cast const_cast最常用的用途就是删除变量的const属性方便做赋值操作const_cast的类型必须是对象的指针或者引用 int main() {const int a 2;int* p const_castint*(a);*p 3;cout a endl;cout *p endl;cout a endl;cout p endl;//cout的缺陷char ch x;cout ch endl;return 0; } 思考为什么*p被修改了a却没有被修改 因为常量被存到寄存器中了所以其实改变的是内存中的a但是不是寄存器中的a。这其实是一种优化如果我们想要去掉这种优化用volatile关键字告诉编译器不要优化直接从内存中读取  2.2.4 dynamic_cast针对父类指针或引用的向下转型 dynamic_cast用于将一个父类对象的指针/引用转换为子类对象的指针或引用(动态转换)向上转型子类对象指针/引用-父类指针/引用(不需要转换赋值兼容规则)向下转型父类对象指针/引用-子类指针/引用(用dynamic_cast转型是安全的)注意 1. dynamic_cast只能用于父类含有虚函数的类2. dynamic_cast会先检查是否能转换成功能成功则转换不能则返回nullptr。 思考 1、为什么父类和子类明明是两种类型但是向上转型不需要转换呢 class A { public:virtual void f() {}int _a 0; };class B : public A {public:int _b 1; };int main() {B objb;A obja objb;A ra objb;double d 1.1;const int i d;return 0; } 2、为什么向下转型是不安全的 因为子类的指针或引用如果是父类对象那么会存在一部分的越界 3、为什么 dynamic_cast只能用于父类含有虚函数的类 dynamic_cast转换是在运行时进行转换因为只有对于这种类层次结构才应该将派生类的地址赋给基类指针。运行时转换就需要知道类对象的信息继承关系等。C对象模型中对象实例最前面的就是虚函数表指针通过这个指针可以获取到该类对象的所有虚函数包括父类的。因为派生类会继承基类的虚函数表所以通过这个虚函数表我们就可以知道该类对象的父类在转换的时候就可以用来判断对象有无继承关系。 所以虚函数对于正确的基类指针转换为子类指针是非常重要的。 4、dynamic_cast的使用原理 父类指针或引用如果本来指向的是子类的对象那么类型转化是安全的如果原本指向的是父类的对象那么转化是不安全的有越界但是编译器检查不出来)所以dynamic_cast可以帮助我们去判断这种情况如果不符合安全转化的条件就会返回nullptr。 void fun(A* pa) {// 向下转换直接转换是不安全的// 如果pa是指向父类A对象存在越界问题B* ptr dynamic_castB*(pa);if (ptr!nullptr){ptr-_a;ptr-_b;}else{cout 转换失败 endl;} }int main() {// 向下转换规则父类对象不能转换成子类对象但是父类指针和引用可以转换子类指针和引用B b1;A a;B b;fun(a);fun(b);return 0; } 2.3 为什么C需要四种类型转换 C风格的转换格式很简单但是有不少缺点的1、隐式类型转化有些情况下可能会出问题比如数据精度丢失 2、显式类型转换将所有情况混合在一起代码不够清晰 3、为了提供更安全、更明确的类型转换使得代码意图更为清晰 因此C提出了自己的类型转化风格注意因为C要兼容C语言所以C中还可以使用C语言的转化风格。因此C的转化风格并非强制性的只不过是程序员之间的一种规范。 2.4 RTTI RTTIRun-time Type identification的简称即运行时类型识别。RTTI只适用于包含虚函数的类。 C通过以下方式来支持RTTI 1. typeid运算符返回指出对象类型的值 2. dynamic_cast运算符根据虚基表判断有无继承关系并判断是否可以转化 3. decltype推断表达式返回值的类型 2.5 相关面试题 1. C中的4中类型转化分别是_________、_________、_________、________ 2.描述四种类型转化各自的应用场景。
http://www.zqtcl.cn/news/547514/

相关文章:

  • 济南网站建设92jzh收不到wordpress的邮件
  • 一键优化在哪里打开新手怎么入行seo
  • 网站建设的费用明细创建公司网站需要注意什么
  • 微网站怎么做的好宣传片拍摄服务
  • 抚州网站开发机构wordpress开源
  • 企业营销网站建设不属于网页制作工具
  • 呼和浩特网站建设信息建服装类网站需要考虑的因素
  • 百度站长平台工具南京开发app的公司
  • 济南如何挑选网站建设公司设计 网站 现状
  • 网站开发建设流程图wordpress 插件 简码
  • 信宜网站开发公司阿里指数app下载
  • AAP网站开发需要多少钱网站核验通知书
  • 网站续费模板wordpress安装到ESC
  • 网站网址大全做商品条形码的网站
  • php购物网站开发成品各大网站收录提交入口
  • 怎么办个人网站网络管理系统中故障管理的目标是
  • 想做网站的客户在哪找下载网站系统源码
  • 网站建设是固定资产还是列费用soho做网站
  • 学校建设评建工作网站应用中心软件
  • 网站建设公司如何拓宽业务跨境进口网站怎么做
  • 邢台企业建站速卖通网站怎样做店面的二维码
  • 网上竞价采购网站建设wordpress添加发布视频
  • 隐形眼镜网站开发的经济效益微企点自助建站系统
  • 延庆网站建设优化seo中山百度seo排名公司
  • 做灯箱的网站做一个app需要多少成本
  • 江苏建设厅网站石家庄建设信息网
  • 各类专业网站建设企业建立网站需要
  • 多合一可拖曳修改优化网站建设品牌运营和品牌推广
  • 广州网站建设seo推广产品网站建设
  • 网站建设套餐电话无锡公司网站制作