第67课 经典问题解析五

1. 指针的判别

(1)拾遗

  ①C++中仍然支持C语言中的可变参数函数

  ②C++编译器的匹配调用优先级重载函数>函数模板>变参函数

(2)思路

  ①将变量分为两类:指针 VS 非指针

  ②编写函数:

    指针变量调用时回true

    非指针变量调用时返回false

(3)函数模板与变参函数的化学反应

template<typename T>  //优先匹配函数模板

bool IsPtr(T* v) // match pointer
{
    return true;
}

//变参函数            //再匹配变参函数
bool IsPtr(...)  // match non-pointer
{
    return false;
}

【编程实验】指针判断

(4)存在的缺陷及完善

  ①变参函数无法解析自定义类类型的对象参数,可能造成程序崩溃

  ②可以在编译期就精确匹配结果,而不需等到实际调用IsPtr时才确定。思路是通过sizeof,具体见例子中的注释。

2. 构造函数中的异常

(1)当构造函数中抛出异常时:

  ①构造函数立即停止。

  ②当前对象无法生成

  ③析构函数不会被调用

  ④对象所占用的空间立即收回

(2)工程项目中的建议

  ①不要在构造函数中抛出异常(注:也可以在构造函数中try-catch可能的异常,并在异常发生时做善后的处理(如资源释放),最后再将这个异常抛出,以通知外部的函数。但建议不要这样做,因为有更好的二阶构造模式,二阶模式在内部自己处理了异常,而抛异常的方法是把异常处理再次丢给了外部的函数)

  ②当构造函数可能产生异常时,使用二阶构造模式

【编程实验】构造中的异常

3. 析构函数中的异常

(1)析构函数的抛出异常导致:对象所使用的资源无法完全释放

(2)避免在析构函数中抛出异常

4. 小结

(1)C++中依然支持变参函数

(2)变参函数无法很好的处理对象参数

(3)利用函数模板变参函数能够判断指针变量

(4)构造函数和析构函数中不要抛出异常

时间: 2024-10-13 23:57:35

第67课 经典问题解析五的相关文章

第六十七课、经典问题解析五

一.问题一:编写一个函数判断一个变量是不是指针 1.拾遗 (1).c++中仍然支持C语言中的可变参数函数 (2).c++编译器的匹配调用优先级:重载函数-------->函数模板--------->变参函数 2.思路 (1).将变量分为两类:指针VS非指针 (2).编写函数 A.指针变量调用返回true B.非指针变量调用时返回false 3.函数模板与变参函数的化学反应 template<typename T> //优先匹配函数模板 bool IsPtr(T* v) // mat

经典问题解析五(五十五)

在面试中有可能会遇到这个面试题,编写程序判断一个变量是不是指针.我们咋一看是不是有点懵逼,我们可以想到利用 C 语言中的可变参数函数.在 C++ 中依然是支持的,C++ 编译器的匹配调用优先级是:1.重载函数:2.函数模板:3.变参函数.我们可以将变量分为两类:指针和非指针.需要编写函数的功能是当是指针变量调用时便返回 true,是非指针变量调用时返回 false. 下来我们就来试着编写下这个函数 #include <iostream> #include <string> usin

经典问题解析五

c+++中任然支持c语言中的可变参数函数 c++编译器的匹配调用优先级 1.重载函数 2.函数模板 3.变参函数 存在的缺陷: 变参函数无法解析对象参数,可能造成程序崩溃 进一步的挑战: 如何让编译器精确匹配函数,但不进行实际的调用?(sizeof) 构造中的异常 构造函数抛出异常 构造过程立即停止 当前对象无法生成 析构函数不会被调用 对象所占用的空间立即收回 工程项目中的建议 不要在构造函数中抛出异常 当构造函数可能产生异常时,使用二阶构造模式 避免在析构函数中抛出异常!! 析构函数的异常将

第55课 经典问题解析(四)

1. 关于动态内存分配 (1)new和malloc的区别 区别 new malloc 是否是关键字 关键字,是C++的一部分.被所有的C++编译器支持. 由C库提供的函数,注意是函数,而不是关键字,要依赖C库(cstdlib),在某些系统开发(如嵌入式)中可能不能调用. 分配单位 以具体类型为单位 以字节为单位 内存初始化 申请时可进行初始化 仅根据需要申请定量的内存,但并不进行初始化. 是否触发构造函数的调用 会触发.对象的创建只能使用new 不会,仅分配需要的内存空间,因此不适合面向对象开发

第24课 经典问题解析二

关于析构的疑问: 当程序中存在多个对象的时候,如何确定这些对象的析构顺序? 多个对象析构时,析构顺序与构造顺序相反. 假设构造三个对象a.b.c,则程序结束时,析构顺序为c.b.a. 程序示例: 1 #include <stdio.h> 2 3 class Member 4 { 5 const char* ms; 6 public: 7 Member(const char* s) 8 { 9 printf("Member(const char* s): %s\n", s);

C++--第24课 - 专题四经典问题解析

第24课 - 专题四经典问题解析 1. 历史的痕迹 #include <cstdlib> #include <iostream> using namespace std; template<class T>  //以前是用typename定义,现在是用class定义 T Minus(T a, T b) { return a - b; } template<class T>  //类模板 class Add { public: T add(T a, T b)

C++--第14课 - 专题二经典问题解析

第14课 - 专题二经典问题解析 1. malloc与free和new与delete有什么区别? malloc和free是函数,new和delete是关键字. #include <cstdlib> #include <iostream> using namespace std; class Test { private: int i; public: Test() { cout<<"Test()"<<endl; i = 0; } Test

Spring 源码解析之DispatcherServlet源码解析(五)

Spring 源码解析之DispatcherServlet源码解析(五) 前言 本文需要有前四篇文章的基础,才能够清晰易懂,有兴趣可以先看看详细的流程,这篇文章可以说是第一篇文章,也可以说是前四篇文章的的汇总,Spring的整个请求流程都是围绕着DispatcherServlet进行的 类结构图 根据类的结构来说DispatcherServlet本身也是继承了HttpServlet的,所有的请求都是根据这一个Servlet来进行转发的,同时解释了为什么需要在web.xml进行如下配置,因为Spr

Visual C NET数据库开发经典案例解析 附书光盘免费下载

为了让更多的朋友学得更快我共享出这代码(由于文件太大,我只上传了第二章人事管理的代码): 下载地址:http://www.cnblogs.com/Files/meta/Chap2.rar 配套光盘使用说明 (1)  本光盘是<Visual C#.NET数据库开发经典案例解析>的配套光盘,与图书一起发行,不得单独出售. (2)  本光盘的主要内容包括各章示例程序的代码及数据库文件.光盘的说明文件为Readme.txt,就是本文件. (3)  示例程序是按照它们出现的章顺序编排的. (4)  光盘