• 备忘


    1.mutable 可以消除const的局限性

    class A
    {
     public:
      void print() const;//声明为const的成员函数不能修改成员变量的值
     private:
      int m;
    
    }
    
    class A
    {
     public:
      void print() const;//成员变量声明为mutable之后可以突破const的限制,此时该
                           //const函数可以修改成员变量的值
      private:
     mutable  int m;
    
    }

     2.inline的使用方法

    inline 是一种“用于实现的关键字”;而不是一种用于声明的关键字。(用于声明的关键字如extern)

    所以其使用方法为:1在类中声明的时候加不加inline是无所谓的,在类外定义的时候必须加inline

                               2.直接在类内实现,则函数默认为inline

    内联函数是以代码膨胀为代价的,仅仅省去了函数调用时的开销,从而提高函数的执行效率。

    不宜使用内联的情况:1 函数体的代码太长  2 函数体中存在循环   3 构造函数和析构函数最好不要使用内联函数,因为它可能隐藏一些行为,如

                                  偷偷地执行了基类或成员对象的构造函数和析构函数。

     

    3.内联函数和宏定义的区别:

    首先宏定义是C语言中的特色,应用较多,在C++中应用较少,同时应该尽量避免使用宏。

    宏是在代码处不加任何验证的简单替代,而内联函数是讲代码直接插入到代码处。

    4 必须采用列表初始化式初始化的成员变量

       const int * a;//不用非得在列表初始化式中初始化

      const int a;//必须

    const int *const int a;//必须

    int &a;//引用初始化必须在列表初始化中初始化,同时必须给其绑定一个对象,而不是简单赋值

    5.C++有了malloc/free,为什么还需要new/delete?

     malloc/free是C中库函数,new/delete是C++运算符。

    对于非内部数据类型的对象而言,只用malloc/free无法满足动态对象的要求。

    对象在创建的同时要执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是库函数,不是运算符,

    不在编译器的控制范围内,不能将执行构造函数和析构函数的任务强加给malloc/free.

    所以,new/delete是可以在创建动态内存的时候同时自动调用析构函数,在销毁对象之前自动调用析构函数的,是C++中的运算符;

    malloc/free是只能创建动态内存和销毁对象,是库函数。

    6.关于继承的权限问题

    关于private成员:如果成员在基类中是private,则只有基类和基类的友元可以访问该成员。派生类不能访问基类的private成员,也不能使自己的用户访问那些成员。

     如果基类成员为public或者Protected,则派生列表中的访问标号决定该成员在派生类中的访问级别:

     public 继承:基类成员保持自己的访问级别。

                     即 基类的public成员为派生类的public成员,基类的protected成员为派生类的protected成员。

    protected继承:基类的public和protected成员在派生类中为protected成员。

    private继承:基类的所有成员在派生类中为private成员。

    7.关于static 成员变量和成员函数的问题

    静态数据成员必须分配内存,但是类定义并不为成员函数分配内存,所以

    static成员函数必须在类体外定义(可以分配内存),此时不能再有关键字static;

    也不能在头文件中定义,否则容易出现多次包含头文件导致多次包含static,

    所以只能放在类对应的.cpp中。

     static成员变量只能在类体内声明,在类体外定义。

    static const成员可以在类体内初始化,但是必须在类体外定义一次,只是定义的时候不用赋初值。

     demo.h

    class demo

    {

     private:

    static int count;

    static const int i=1;

    }

    demo.cpp

    #include"demo.h"

    int demo::count=0;

    const int demo::i;

     8 面向对象的设计原则:封装、继承、多态

    封装的作用是为了隐藏细节,使得代码模块化;

    继承的作用是为了实现代码重用;

    多态的作用是为了实现接口重用。

    而且现实是,要有效重用代码往往很难,,而真正最具有价值的重用是接口重用,因为“接口是公司最有价值的资源。设计接口比用一堆类来实现这个接口更难,而且接口

    需要耗费更昂贵的人力和时间”。其实,继承作为为重用代码而存在的理由已经越来越薄弱了,因为“组合”可以很好的取代继承扩展代码现有的功能,而且组合表现的更好(至少可以防止类爆炸)。

    因此笔者认为,继承存在的意义很大程度上是作为多态而非扩展现有的代码。

    (程序员面试宝典)

    9.重载(overload)和重写(覆盖 override)的区别

     

     

  • 相关阅读:
    C语言 assert 函数
    C语言 exit 函数
    C语言 main 函数参数 main(int argc, char *argv[])
    《一线架构师实践指南》读后感(一)
    机器学习十讲第八讲
    机器学习十讲第七讲
    Python通过IMAP实现邮箱客户端
    ABAP-PS操作
    ABAP-AES加解密
    ABAP-HmacSHA256
  • 原文地址:https://www.cnblogs.com/limera/p/memo.html
Copyright © 2020-2023  润新知