C++中const小结

一、const

1.指针和const

可以用两种方式将const关键字用于指针:
(1)让指针指向一个常量对象,可以防止使用该指针修改所指向对象的值
       
 int age = 39;
 const int * pt = &age;//声明一个指向常量的指针pt

pt指向一个const int(这里是39),因此不能使用pt来修改age:

*pt = *pt+1;// wrong , 不能使用该指针(这里是pt)修改所指向对象(这里是age)的值!
 cin>>*pt;//wrong,同上

注意:

  • pt的声明并不意味着它指向的值就是一个常量,此处age就不是一个常量,所以可以通过age变量来修改age的值。
age = 40;//right, 此时*pt = 40
  • 不能通过pt修改变量的值,但是可以将新地址赋给pt
int sage = 80;
pt = &sage;
  • ① 将常规变量的地址赋给常规指针:可以,并且很常见
int a= 10;
int *b = &a;
  • ②将常规变量的地址赋给const 指针:可以,如上面的age的例子
  • ③将const变量的地址赋给常规指针:不可以 
const int age = 39;
int * p = &age;
由于p是常规指针,可以通过*p来修改age的值,这与age是const常量矛盾。
const int months[12] = {31,28,31,30,31,30,31,31,30,31,30,31};//由const数据组成的数组
// ……

int sum( int arr[], int n); //should have been const int arr[]

// ……

int  j = sum(months, 12);//wrong!months是常量地址,不能将其赋给非常量指针。
  • ④将const变量的地址赋给const指针:可以,此时既不能通过指针来修改变量的值,也不能通过变量名来修改变量值。
(2) 将指针本身声明为一个常量,可以防止改变该指针指向的位置(无法修改指针的值)
int sloth = 3;
const int *ps = &sloth;//不能通过ps 修改sloth的值,但是可以给sloth重新赋值
int * const finger = &sloth;// finger是一个指向int的const指针,
                            // 可以通过finger修改sloth的值(*finger = 4)
                            // 但是不能把别的地址赋给finger

2.类中的const

2.1.const修饰类中的数据成员

class A 
{
    // ……
    const int size;
    
    // ……
};
const数据成员只在某个对象生存期内是常量,而对于整个类而言却是可变的。因为类可以创建多个对象,不同的对象其const数据成员的值可以不同。所以 不能在类声明中初始化const数据成员 ,因为类的对象未被创建时,编译器不知道const 数据成员的值是什么。如
    
class A
{
    const int size = 100;    //错误
    int array[size];         //错误,未知的size
}
const数据成员的初始化只能在类的构造函数的初始化表中进行 。要想建立在整个类中都恒定的常量,应该用类中的枚举常量来实现。如
     
class A
{
    // ......
    enum {size1=100, size2 = 200 };
    int array1[size1];
    int array2[size2]; 
}
枚举常量不会占用对象的存储空间,他们在编译时被全部求值。但是枚举常量的隐含数据类型是整数,其最大值有限,且不能表示浮点数。

2.2.const修饰类成员函数

class A 
{
    //......
    void fun() const ;
};
定义时:
       
void A::fun() const {……}
  • (1)const函数(fun())可以被const对象调用,但const成员函数中不能调用非const成员函数(因为可能会改变数据成员);
  • (2)const成员函数可以访问对象的const成员,别的函数不可以;
  • (3)非const对象可以访问const成员函数;
  • (4)一个没有被声明为const的成员函数不能被一个const对象调用.

二、static

static是C++中的关键字,可用在局部静态变量外部静态变量/函数静态成员变量/成员函数

1.局部静态变量

在函数内部或者代码块内部用static修饰的变量,根据《C++三种管理数据内存方式》https://blog.csdn.net/sinat_21107433/article/details/80101909一文的知识点,在函数或者代码块内部用static修饰的变量,表明其无链接性(即该变量只在该函数或者代码块里可见,作用域为该代码块或者该函数),为静态变量分配在静态存储区,在程序整个运行期间都不释放(即便退出该函数)。而在函数里的普通变量为自动变量(auto),保存在栈里面,随着函数结束而被释放。局部静态变量常用于计数之类的。

2.外部静态变量/函数

在函数外部(该文件的任何一个函数外部)声明定义的一个变量或者函数用static关键字修饰,就成了外部静态变量/函数,它表明该变量/函数具有内部链接性作用域为该文件,外部文件不可以调用该变量/函数

对比而言,在函数外部,定义普通的变量或者函数,比如在file1.cpp里定义int a,说明其有外部链接性,在别的文件file2.cpp里也可以用该变量。(此时在file2.cpp里得声明external int a)

3.静态成员变量/成员函数

类里面的静态成员变量/成员函数属于这个类,而并不属于这个类的某个具体对象,对于这个类的所有对象,都只有唯一一个该变量或者成员函数。在static修饰的成员函数里,没有this指针,因此静态成员函数只能操作类的静态成员变量,不能操作普通的成员变量,也不能调用普通成员函数。但是可以通过参数传递的方式,将this指针传递给静态成员函数

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冯Jungle

您的支持是对我最大的鼓励

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值