(1)变量与常量

1.内存存储区

栈,由编译器分配清除的变量存储区。通常包含局部变量、函数参数等

堆,由new分配的内存块,需要显式delete掉。否则在程序结束后,操作系统会自动回收。

自由存储区,由malloc等分配的内存块,他和堆是十分相似的,不过它是用free来结束自己的生命的。

全局/静态存储区,全局变量和静态变量被分配到同一块内存中,在以前的C语言中,全局变量又分为初始化的和未初始化的,在C++里面没有这个区分了,他们共同占用同一块内存区。static具有记忆功能和全局生存期,也就是说函数内声明的静态变量也具有全局变量特征。

常量存储区,这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改(当然,你要通过非正当手段也可以修改)

  1. //main.cpp
  2. int a = 0;      // 全局初始化区
  3. char *p1;      // 全局未初始化区
  4. void main()
  5. {
  6.     int b;            // 栈区
  7.     char s[] = "abc"; // 栈区 "abc"存储在栈区 s[2]=d 不会报错
  8.     char *p2; // 栈区
  9.     char *p3 = "123456"; // p3在栈区;   "123456\0" 在常量区,此时若p3[2]=8,则会报错
  10.  
  11.     static int c =0;      // 全局(静态)初始化区
  12.     p1 = (char *)malloc(10);
  13.     p2 = (char *)malloc(20); // 分配得来的10和20字节的区域就在堆区
  14.     strcpy(p1, "123456");    // "123456\0" 放在常量区,编译器可能会将它与p3所指向的"123456"优化成一个地方。
  15. }

2.关键字


static,(1) (普通)全局变量(函数)与静态全局变量(函数)(隐藏) 对于其他源文件的隐藏作用,当我们同时编译多个源文件时,所有未加static前缀的全局变量和函数都具有全局可见性(外部链接属性),其它的源文件也能访问。但是加了static,它就是具有“内部链接属性"。

(2)(普通)局部变量与静态局部变量   静态局部变量具有全局作用。

(3)默认初始化为0。 全局变量也存储在静态数据区。在静态数据区,内存中所有的字节默认值都是0x00。

(4) C++中的类成员声明static 

静态数据成员是类的成员,而不是对象的成员,也就是说 类的静态成员函数是属于整个类而非类的对象。

静态成员函数不含this指针。 静态成员是可以独立访问的,也就是说,无须创建任何对象实例就可以访问。

所以它没有this指针,这就导致 了它仅能访问类的静态数据和静态成员函数。 

也就不能将静态成员函数定义为虚函数。  

const, 

const修饰指针变量时:

  (1)只有一个const,如果const位于*左侧,表示指针所指数据是常量,不能通过解引用修改该数据;指针本身是变量,可以指向其他的内存单元。

  (2)只有一个const,如果const位于*右侧,表示指针本身是常量,不能指向其他内存地址;指针所指的数据可以通过解引用修改。

  (3)两个const,*左右各一个,表示指针和指针所指数据都不能修改。

const修饰函数参数:

  传递过来的参数在函数内不可以改变,与上面修饰变量时的性质一样。

const修饰成员函数:

(1)const修饰的成员函数不能修改任何的成员变量(mutable修饰的变量除外)

(2)const成员函数不能调用非const成员函数,因为非const成员函数可以会修改成员变量

  class Point{
      public :
      Point(int _x):x(_x){}
 
     void testConstFunction(int _x) const{
  
         ///错误,在const成员函数中,不能修改任何类成员变量
        x=_x;
 
         ///错误,const成员函数不能调用非onst成员函数,因为非const成员函数可以会修改成员变量
        modify_x(_x);
     }
 
     void modify_x(int _x){
         x=_x;
     }
 
     int x;
 };

const修饰函数返回值:

(1)指针传递

如果返回const data,non-const pointer,返回值也必须赋给const data,non-const pointer。因为指针指向的数据是常量不能修改。

const int * mallocA(){  ///const data,non-const pointer
     int *a=new int(2);
     return a;
 }
 
 int main()
 {
     const int *a = mallocA();
     ///int *b = mallocA();  ///编译错误
     return 0;
 }

(2)值传递

 如果函数返回值采用“值传递方式”,由于函数会把返回值复制到外部临时的存储单元中,加const 修饰没有任何价值。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值