常应用问题

2019-12-30  本文已影响0人  Crazy_Bear

C++

const

引用实际上会被解释为一个指针常量

类相关:

  1. const 修饰成员变量

    表示成员常量,不能修改,同时它只能在初始化列表中赋值

  2. const修饰成员函数

    该成员函数不能修改也不能调用类中任何非常成员变量,一般写在函数的最后表示

    • 常成员函数只能访问常成员变量
    • 普通成员函数不能访问常成员变量
  3. const修饰对象/对象指针/对象引用

    • 表示该对象为常量对象,任何成员都不可被修改
    • 任何非const成员函数都不能被调用,因为任何非const函数都有修改成员变量的企图
  4. 重载问题

    能否构成重载的区别在于用户能否知晓函数的不同

    1)放在函数尾部修饰

    作为对函数不会修改成员变量的修饰,即void fun() const;和void fun(); 这种情况下const能构成重载,用户对于两个函数,一个会修改参数,一个不会修改参数,这是足以区分两个函数的,因此能构成重载。

    2)放在函数返回值处修饰

    作为对函数返回值的修饰,即const void fun(); 或者 const char* fun() 或者char* const fun(); 与没有const修饰的函数之间。这种情况下只是向用户返回一个调用的值,用户只管接受,他们传给函数的值并未发生变化,且函数内部发生什么事他们也不曾知晓(不像1)中有修改参数的区别),所以用户并不知晓函数的区别,因此对于函数返回值的const修饰无法构成重载。

    3)放在函数参数中

    这种情况下要分类讨论:

    i.如果是值传递,即:void fun(const int i); 和 void fun(int i );则不会构成重载,值是复制进去的,里面发生了什么变化都和用户的值无关,因此用户不会知晓。

    ii.如果是引用/指针传递,即void fun(const int *i); 和 void fun(int *i);或者void fun(const int& i);和 void fun(int& i);之间,这种情况会构成重载,因为用户传入的值可能会被改变,因此这是足以区分函数的。

static:

  1. 修饰普通变量,修改变量的存储区域和生命周期,使变量存储在静态区,在 main 函数运行前就分配了空间,如果有初始值就用初始值初始化它,如果没有初始值系统用默认值初始化它。
  2. 修饰普通函数,表明函数的作用范围,仅在定义该函数的文件内才能使用。在多人开发项目时,为了防止与他人命令函数重名,可以将函数定位为 static。
  3. 修饰成员变量,修饰成员变量使所有的对象只保存一个该变量,而且不需要生成对象就可以访问该成员。
  4. 修饰成员函数,修饰成员函数使得不需要生成对象就可以访问该函数,但是在 static 函数内不能访问非静态成员。

JAVA

final

final可以修饰:属性(变量),方法,类,局部变量(方法中的变量)

final这个关键字的含义是“这是无法改变的”或者“终态的”;

static

static 关键字主要有以下四种使用场景:

  1. 修饰成员变量和成员方法: 被 static 修饰的成员属于类,不属于单个这个类的某个对象,被类中所有对象共享,可以并且建议通过类名调用。被static 声明的成员变量属于静态成员变量,静态变量 存放在 Java 内存区域的方法区。调用格式:类名.静态变量名 类名.静态方法名()
  2. 静态代码块: 静态代码块定义在类中方法外, 静态代码块在非静态代码块之前执行(静态代码块—>非静态代码块—>构造方法)。 该类不管创建多少对象,静态代码块只执行一次.
  3. 静态内部类(static修饰类的话只能修饰内部类): 静态内部类与非静态内部类之间存在一个最大的区别: 非静态内部类在编译完成之后会隐含地保存着一个引用,该引用是指向创建它的外围类,但是静态内部类却没有。没有这个引用就意味着:1. 它的创建是不需要依赖外围类的创建。2. 它不能使用任何外围类的非static成员变量和方法。
  4. 静态导包(用来导入类中的静态资源,1.5之后的新特性): 格式为:import static 这两个关键字连用可以指定导入某个类中的指定静态资源,并且不需要使用类名调用类中静态成员,可以直接使用类中静态成员变量和成员方法。

static final和final static:

static final和final static没什么区别,一般static写在前面。

static final:

static修饰的属性强调它们只有一个,final修饰的属性表明是一个常数(创建后不能被修改)。static final修饰的属性表示一旦给值,就不可修改,并且可以通过类名访问。

static final也可以修饰方法,表示该方法不能重写,可以在不new对象的情况下调用

上一篇 下一篇

猜你喜欢

热点阅读