• C++难点的一些总结


    一、 C++成员函数的重载

    C++中的成员函数有四种,分别是普通成员函数,virtual虚函数,const成员函数。

    (1) void func(int a);

    (2) virtual void func(int a);

    (3) void func(int a) const;

    如果在一个类中,声明这四种函数,哪是重复定义?哪些是重载?

    其中(1)(2)是重复定义,故编译不能通过,而(3)与(1)(2)是不同类型的函数,是重载。

    【注意:众所周知,C++函数重载时返回值是不参与重载决议的, 也就是说,

    int lex_cast(const char*);

    double lex_cast(const char*);

    这样两个函数在同一个编译单元同一个 namespace 中时, 会编译报错。

    成员函数被重载的特征是:

    (1)具有相同的作用域(即同一个类定义中);

    (2)函数名字相同

    (3)参数类型,顺序 或 数目不同(包括const参数和非const函数)

    (4)virtual关键字可有可无。

    从成员函数的重载特征中,可以知道(1)(2)是重复定义。那么(3)为什么和(1)(2)不同呢?

    因为类中的函数,都会自动添加一个自身类指针this,所以

    void func(int a) ==== void func(Base * this, int a)

    virtual func(int a) ==== virtual func(Base *this, int a)

    void func(int a)const  ===  void func(const Base *this, int a) const  【重要】

    所以(3)可以与(1)(2)发生重载,因为参数有一个const。

    二、inline, static, constructor三种函数都不能带有virtual关键字

    (1).为什么C++不支持构造函数为虚函数?

    这个原因很简单,主要是从语义上考虑,所以不支持。因为构造函数本来就是为了明确初始化对象成员才产生的,然而virtual function主要是为了再不完全了解细节的情况下也能正确处理对象。另外,virtual函数是在不同类型的对象产生不同的动作,现在对象还没有产生,如何使用virtual函数来完成你想完成的动作。(这不就是典型的悖论)

    【最简单是因为,类中只有构造、析构和拷贝构造三个函数不能被继承,所以每个类都必须有明确的编译期就确定的上述三个函数,没有的会自动生成。】

    (2).为什么C++不支持内联成员函数为虚函数?

    其实很简单,那内联函数就是为了在代码中直接展开,减少函数调用花费的代价,虚函数是为了在继承后对象能够准确的执行自己的动作,这是不可能统一的。(再说了,inline函数在编译时被展开,虚函数在运行时才能动态的邦定函数)

    4.为什么C++不支持静态成员函数为虚函数?

    这也很简单,静态成员函数对于每个类来说只有一份代码,所有的对象都共享这一份代码,他也没有要动态邦定的必要性。【只是因为没有太大必要性所以这样,这条可以死记住。因为实际上是可以实现的,技术上没什么问题,就是为了逻辑性而强制这样规定了。】

    5.(补充)为什么C++不支持友元函数为虚函数?

    因为C++不支持友元函数的继承,对于没有继承特性的函数没有虚函数的说法

  • 相关阅读:
    上传图片,正在加载,loading
    bootstrap-table(2)问题集
    Bootstarp-table入门(1)
    bootstrap-table给每一行数据添加按钮,并绑定事件
    获得 bootstrapTable行号index
    Http请求中Content-Type讲解以及在Spring MVC注解中produce和consumes配置详解
    enums应用详解
    bootstrap-table.min.js不同版本返回分页参数不同的问题
    Linux学习笔记之Linux目录结构、磁盘命名、启动过程
    Linux学习笔记之Linux相关知识
  • 原文地址:https://www.cnblogs.com/hnfxs/p/3163673.html
Copyright © 2020-2023  润新知