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

成都网站建设四川冠辰室内设计网站哪些号

成都网站建设四川冠辰,室内设计网站哪些号,网站后台设计教程视频,登陆wordpress文章目录 1 类的动态内存分配1.1 C动态内存分配1.2 拷贝构造函数1.3 赋值运算符(operator)重载 2 异常3 类型转换运算符 1 类的动态内存分配 1.1 C动态内存分配 在C/C中都可以使用malloc/free来分配内存#xff0c;但C还有一种更好的方法#xff1a;new和delete。下面以动态… 文章目录 1 类的动态内存分配1.1 C动态内存分配1.2 拷贝构造函数1.3 赋值运算符(operator)重载 2 异常3 类型转换运算符 1 类的动态内存分配 1.1 C动态内存分配 在C/C中都可以使用malloc/free来分配内存但C还有一种更好的方法new和delete。下面以动态分配int类型的变量为例来看看如何使用这两个关键字 1变量 int *pn new int; delete pn;2数组 int *psome new int[10]; delete []psome;1.2 拷贝构造函数 拷贝构造函数是用于将一个对象复制到新创建的对象中如果用户没有声明拷贝构造函数的话编译器将生成一个默认的拷贝构造函数它将逐个赋值非静态成员。它的原型如下 Class_name(const Class_name )假设有一个String类,motto是一个String类对象它的拷贝构造函数为String(const String )它的拷贝构造函数被调用的时机有以下几种 String ditto(motto); String metto motto; String also String(motto); String *pString new String(motto)所以如果有一个函数传的参数是String类形参而不是引用的话编译器将临时使用拷贝构造函数创建一个该类的副本。假设String类的构造函数中有分配内存析构函数中有释放内存。此时若用户没有定义自己的拷贝构造函数则编译器会调用默认的拷贝构造函数(而不是构造函数)而在这个函数调用完后将调用析构函数释放内存。这就会导致一些内存错误。应该自己定义一个拷贝构造函数如下所示 String(const String other) { len other.len; str new char[len 1]; strcpy(str, other.str); } 一个函数如果返回对象的引用则不会调用拷贝构造函数否则将调用拷贝构造函数。 1.3 赋值运算符(operator)重载 前面我们知道String metto motto;将调用拷贝构造函数那什么时候调用拷贝构造函数什么时候调用赋值运算符重载在类定义的时候的调用拷贝构造函数在类定义完后的调用赋值运算符重载 调用拷贝构造函数: String metto motto; 调用赋值运算符重载: String metto; metto motto;与复制构造函数相似赋值运算符的隐式实现也对成员进行逐个复制。所以对于上面的metto motto来说如果metto原本就通过动态内存分配分配了一块内存这样隐式的拷贝就会导致之前的内存来不及释放。应该自己定义一个赋值运算符重载函数如下所示 String String::operator(const String st) {if (this st)return *this;delete [] str;len st.len;str new char [len 1];strcpy(str, st .str) ;return *this; }2 异常 C异常是对程序运行过程中发生的异常情况的一种响应。异常提供了将控制权从程序的一个部分传递到另外一部分的途径。C可以使用try-catch来捕获异常直接来看一个求调和平均值2ab/(ab)的例子 double hmean(double a, double b);int main(){double x, y, z;std::cout Enter two numbers: ;while (std::cin x y){try{z hmean(x,y);}catch(const char * s){ // start of exception handlerstd::cout s std::endl;std::cout Enter a new pair of numbers: ;continue;} // end of handlerstd::cout Harmonic mean of x and y is z std::endl;}return 0; }double hmean(double a, double b){if(a-b){throw bad hmean() arguments: a -b not allowed;}return 2.0 * a * b / (ab); }在try块中的代码若判断出异常后throw一个异常(类似跳转,同时退出当前函数)就能被catch捕获。下面再来看一下将对象用作异常类型的例子 #includeiostreamclass bad_hmean{ private:double v1;double v2; public:bad_hmean(int a 0, int b 0) : v1(a), v2(b) {}void mesg(); };inline void bad_hmean::mesg(){std::cout hmean( v1 , v2 ): invalid arguments: a -b\n; } double hmean(double a, double b);int main(){using std::cout;using std::cin;using std::endl;double x, y, z;cout Enter two numbers: ;while(cin x y){try { // start of try blockz hmean(x, y);cout Harmonic mean of x and y is z endl;}catch(bad_hmean bh){ // start of catch blockbh.mesg();cout Try again.\n;continue;}}return 0; }double hmean(double a, double b){if (a-b){throw bad_hmean(a,b);//算作局部变量,等catch结束后该变量将销毁}return 2.0 * a * b / (a b); }也就是说发送异常时可以throw一个类然后在catch时使用bad_hmean bh获得这个对象的引用。 3 类型转换运算符 C语言中的强制类型转换允许几乎所有情况的转换比如将一个指针的地址转换为char这样就输出的是这个32位指针变量的地址的低8位(大端)。显然这种转换是没有意义的大概率是程序员写错了所以C有几种更严格的类型转换机制 (1)dynamic_cast 用于在运行时执行安全的向下类型转换通常用于处理多态类型的类层次结构如继承关系。 dynamic_casttype_name(expression)type_name:目标类型的名称通常是一个类或类的指针/引用类型。expression:是要进行类型转换的表达式通常是指向基类对象的指针或引用。dynamic_cast 会检查是否可以安全地将 expression 转换为 type_name 类型如果可以它将返回一个指向目标类型的指针(或引用)否则返回一个空指针(如果转换失败)或抛出 std::bad_cast 异常如果转换不安全。下面看一个例子 #includeiostreamusing namespace std;class Shape { public:virtual void draw() { coutshapeendl; } };class Circle : public Shape { public:void draw() override { coutcircleendl; }void specialCircleFunction() { coutspecial circleendl; } };int main() {Shape* shape new Circle;Circle* circle dynamic_castCircle*(shape);if (circle) {circle-specialCircleFunction();} else {// 转换失败}delete shape;return 0; }(2)const_cast 用于添加或去除对象的 const 限定符以便在需要时更改对象的常量性。通常情况下const_cast 用于修改指向 const 对象的指针或引用以使其可以修改对象的值。但要注意滥用 const_cast 可能会导致未定义的行为因此应该谨慎使用。 const_castnew_type(expression)new_type:要转换成的类型。expression:要进行类型转换的表达式通常是指向const对象的指针或引用。下面看一个例子 #include iostreamint main() {const int x 10;const int* ptr1 x;int* ptr2 const_castint*(ptr1); // 使用const_cast去除const限定符*ptr2 30;std::cout After modification: x x std::endl;return 0; }(3)static_cast 用于执行编译时类型转换可以在合理的情况下将一个类型转换为另一个相关类型例如将整数转换为浮点数。但要注意static_cast 不提供运行时检查因此必须确保类型转换是安全的。 static_castnew_type(expression)new_type:要转换成的目标类型。expression:要进行类型转换的表达式。下面来看一个例子 #include iostreamint main() {int integerNumber 42;double doubleNumber static_castdouble(integerNumber);std::cout Double Number: doubleNumber std::endl;return 0; }需要注意的是static_cast 不执行运行时检查因此在使用时需要谨慎确保类型转换是安全的。如果转换不安全可以考虑使用 dynamic_cast 或其他类型转换运算符进行更安全的类型转换。 (4)reinterpret_cast 用于执行低层的类型转换允许你将一个指针类型转换为另一种不相关的指针类型或者将任何类型转换为一个完全不同的类型。这是最不安全的类型转换之一因为它不会进行任何类型检查或转换操作。 reinterpret_castnew_type(expression)new_type:要转换成的目标类型。expression:要进行类型转换的表达式通常是指针、引用或其他表达式。下面看一个例子这里用static_cast的话就无法编译通过。 #include iostreamint main() {int array[5] {1, 2, 3, 4, 5};int* ptr array;char* charPtr reinterpret_castchar*(ptr);std::cout First element of array (as char): static_castint(charPtr[0]) std::endl;return 0; }这是一个非常危险的操作因为它忽略了数据的实际类型和结构。所以reinterpret_cast 应该非常小心地使用只有在确切清楚这种类型转换是必要的情况下才应使用。
http://www.w-s-a.com/news/938423/

相关文章:

  • 网站设计和备案企业官网网站建设免费
  • 公司概况-环保公司网站模板搜索引擎营销的基本流程
  • 门户网站建设经验天津市建设银行租房网站
  • 百度推广 帮做网站吗怎样修改网站的主页内容
  • 网站怎么做dns解析公司官网改版方案
  • 湛江市住房和城乡建设局网站杭州网站公司哪家服务好
  • 设计网站公司湖南岚鸿设计镜像的网站怎么做排名
  • 你注册过哪些网站微信app下载安装官方版2019
  • 杭州滨江的网站建设公司人才招聘网网站策划方案
  • 门户网站是指提供什么的网站网站优化需要工具
  • 和小男生做的网站代理公司注册步骤
  • 天猫网站建设的目标是什么seo有些什么关键词
  • 网站前端建设都需要什么莱芜信息港网页
  • 如何做360网站优化网站建设培训教程新手入门到精通
  • 做网站有的浏览器怎么做网站网站赚钱
  • 织梦 做网站 教程百度登录个人中心官网
  • ftp怎么修改网站wordpress分享积分
  • 营销策划方案的步骤西安关键词优化软件
  • 南宁自己的网站移动互联网技术学什么
  • 2017湖北建设教育协会网站自己接单做网站
  • 定制网站建设制作h5网站要多久
  • 泰安中呼网站建设有限公司 概况个人网站的设计与实现参考文献
  • 圣诞节网站怎么做怎么获取网站的图片
  • 想找个人做网站音乐网站建设教程视频教程
  • 网站收录一键提交阿里巴巴做网站多少钱
  • 怎么做网站投放广告商务网站建设实训报告
  • 服装代销的网站源码国内电子商务网站有哪些
  • qq空间怎么做网站做企业平台的网站有哪些
  • 网站的优缺点wordpress手机适配模板中文
  • 福州网站建设H5广告公司简介简短