每日一学———关键字const和static

const关键字

     阻止一个变量被改变,可以使用const关键字。在定义该const变量时,通常需要对它进行初始化,因为以后就没有机会再去改变它了;

const与define

      两者都可以用来定义常量,但是const定义时,定义了常量的类型,所以更精确一些。#define只是简单的文本替换,除了可以定义常量外,还可以用来定义一些简单的函数,有点类似内联函数(Inline)。const和define定义的常量可以放在头文件里面。

(一)const 修饰成员变量 

       (a) int p;

  const int * p1=&p;//p1可变,*p1不可变,此时不能用*p1来修改,但是p1可以转向

  int * const p2=&p;//p2不可变,*p2可变,此时允许*p2来修改其值,但是p2不能转向。

  const int *const p3=&me;//p3不可变,*p3也不可变,此时既不能用*p3来修改其值,也不能转向。

(b)指针和引用的区别很简单,就是引用更简洁,更安全。因为引用声明时必须初始化。 引用更接近const指针,一旦与某个变量关联,就将一直效忠于他。

(c)const指针可以接受const和非const地址,但是非const指针只能接受非const地址。所以const指针的能力更强一些,所以尽量多用const指针,这是一种习惯。  

(二)const与函数

(a)const与传递值参数

     void function(const int Var); //传递过来的参数在函数内不可以改变.

 (b)const与返回值 

 const int Fuction1 (int);

    此处返回const值,意思指返回的原函数里的变量的初值不能被修改,但是函数按值返回的这个变量被制成副本,能不能被修改就没有了意义,它可以被赋给任何的const或非const类型变量,完全不需要加上这个const关键字.但这只对于内部类型而言(因为内部类型返回的肯定是一个值,而不会返回一个变量,不会作为左值使用),对于用户自定义类型,返回值是常量是非常重要的。

 (c)const与成员函数

 void function(void)const; // ,编译器会对这个函数进行检查,在这个函数中的任何试图改变成员变量和调用非const成员函数的操作都被视为非法

int Stack::functiont(void)  const 

  ++ m_num; // 编译错误,企图修改数据成员 m_num 
 Pop();  // 编译错误,企图调用非const 函数 
 return m_num; 
 }

(三)const与类

(a)const数据成员的初始化只能在类的构造函数的初始化表中进行

 class A

{ const int size = 100;    //错误};

(b)非常量成员函数不能被常量成员对象调用,因为它可能企图修改常量的数据成员:

class Set {

  public:

  Set (void){ card = 0; }

  bool Member(const int) const;

  void AddElem(const int);

  //...

  };

  const Set s;

  s.AddElem(10); // 非法: AddElem不是常量成员函数

s.Member(10); // 正确

(c)成员函数可基于const实现重载。
 

static关键字

 

1.先来介绍它的第一条也是最重要的一条:隐藏。(static函数,static变量均可)

当同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性

2.static的第二个作用是保持变量内容的持久。(static变量中的记忆功能和全局生存期)存储在静态数据区的变量会在程序刚开始运行时就完成初始化,也是唯一的一次初始化。共有两种变量存储在静态存储区:全局变量和static变量,只不过和全局变量比起来,static可以控制变量的可见范围,说到底static还是用来隐藏的。

3.static的第三个作用是默认初始化为0(static变量)

其实全局变量也具备这一属性,因为全局变量也存储在静态数据区。在静态数据区,内存中所有的字节默认值都是0x00,某些时候这一特点可以减少程序员的工作量。

4.static的第四个作用:C++中的类成员声明static

  1. 函数体内static变量的作用范围为该函数体,不同于auto变量,该变量的内存只被分配一次,因此其值在下次调用时仍维持上次的值;  
  2. 在模块内的static全局变量可以被模块内所用函数访问,但不能被模块外其它函数访问;   
  3. 在模块内的static函数只可被这一模块内的其它函数调用,这个函数的使用范围被限制在声明它的模块内;   
  4. 在类中的static成员变量属于整个类所拥有,对类的所有对象只有一份拷贝;   
  5. 在类中的static成员函数属于整个类所拥有,这个函数不接收this指针,因而只能访问类的static成员变量。

类内:

   static类对象必须要在类外进行初始化,static修饰的变量先于对象存在,所以static修饰的变量要在类外手动初始化;

          初始化在类体外进行,而前面不加static,以免与一般静态变量或对象相混淆;
         初始化时不加该成员的访问权限控制符private,public等;        
         初始化时使用作用域运算符来标明它所属类;
          所以我们得出静态数据成员初始化的格式:
                 <数据类型><类名>::<静态数据成员名>=<值>

 

  1. 由于static修饰的类成员属于类,不属于对象,因此static类成员函数是没有this指针的,this指针是指向本对象的指针。正因为没有this指针,所以static类成员函数不能访问非static的类成员,只能访问 static修饰的类成员;如果静态成员函数中要引用非静态成员时,可通过对象来引用。
  2. static成员函数不能被virtual修饰,static成员不属于任何对象或实例,所以加上virtual没有任何实际意义;静态成员函数没有this指针,虚函数的实现是为每一个对象分配一个vptr指针,而vptr是通过this指针调用的,所以不能为virtual;虚函数的调用关系,this->vptr->ctable->virtual function
  3. static类变量或方法通过 类名.变量名或类名.方法名直接引用,而不需要new类。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值