C/C++入门:关键字static与const详解

C/C++入门:关键字static与const

在C/C++中关键字中,最基础最重要的就是static与const,无论是等级考试,还是求职考试都是经常遇见的,今天就详细介绍相关内容。

一、static

1.1 C语言中static

1)修饰局部变量

当再一个函数体内使用static修饰一个变量时,static延长变量的生命周期,不会因为函数调用完而被销毁,
只有当整个程序执行完才被销毁。
只能被定义处的函数进行访问,函数体外不能被访问。

2)修饰全局变量

被static修饰的全局变量,该变量只能在定义该变量的源文件中访问,其他源文件不能被访问。

3)修饰函数

被static修饰的函数,该函数只能在定义该函数的源文件中访问,其他源文件不能被访问。
static函数可以很好地解决不同原文件中函数同名的问题,因为一个源文件对于其他源文件中的static函数是不可见的。

1.2 C++语言中的static:

1)修饰局部变量:(与C相同)

2)修饰全局变量:(与C相同)

3)修饰函数:(与C相同)

4)类的static的成员变量

性质1:该静态变量只归类所有,不归实例化的对象所有,这意味着:它的生命周期不依赖某个对象的创建或释放,而是随程序一直存在着。

性质2:该静态变量需要在类外单独初始化。

#include <iostream>
class My{
public:
	static int Num;
	My() {Num++;}
	~My() {Num--;}
};

int My::Num = 0;  //静态变量初始化

int main(){
	My a;
	My b;
	My c;
	std::cout << My::Num << std::endl;
	return 0;
}
// 结果输出 3

5)类的static的成员函数

性质1:静态成员函数属于类,没有this指针。

性质2:可以通过类名::函数名直接调用。

性质3:静态成员函数只能访问static变量和static函数,非静态成员函数可以访问static变量和static函数。

性质4:static成员函数只能返回static成员变量

性质5:静态成员函数不能是虚函数

二、const

2.1 C语言中的const

1)修饰常量

const可以修饰常量,使该常量的值不能改变,局部变量与全局变量都一样,定义时就要赋值。

补充: const与define对比:

● const常量有数据类型,#define没有数据类型;

● const可以保护被修饰的东西,防止其被意外修改,可以增强程序的健壮性; #define只进行字符替换,没有类型安全检查,在字符替换过程中可能会出现一些错误,例如:边界问题;

● 通常情况下,编译器不会为const常量分配存储空间,而是将其保存在符号表中,作为编译期间的一个常量,不会占用内存以及不进行读操作,效率自然很高;

● 有些集成化的调试工具可以对const常量进行调试,但不能对宏常量进行调试。

2)修饰指针

int b = 10;

const int *a = &b;//情况1

int const *a = &b;//情况2

int* const a = &b;//情况3

const int* const a = &b;//情况4

● 忽略类型int(因情况而定,有的代码中是char、double等等类型或者函数名等);

● const放在*号左边时,代表的意思是该指针变量指向的内容是不能通过指针变量来改变的(常量指针); //底层const

● const放在*号右边时,代表的意思是该指针变量本身的内容是不能改变的(指针常量)。//顶层const

由此很明显我们可以判断以上四种情况:

情况1、2属于常量指针,

情况3属于指针常量,

情况4既是常量指针也是指针常量。

3)修饰函数

3.1)const修饰函数的参数

● 防止修改指针指向的内容

void Funtext(char *dest,const char *sou)

● 防止修改指针本身

void swap(int* const p1, int* const p2)

●防止修改指针本身和指针指向的内容

void Fun(const int* const p)

3.2)const修饰函数的返回值

如果函数返回值以指针传递方式并且加const修饰,那么函数返回值(指针)的内容就不能被修改,该返回值只能被附加给加const修饰的同类型返回值(指针)。

const char* GetString(void);

2.2 C++语言中的const

C++兼容C语言,C语言中的const特性,C++同样适用,下面将一些C语言中没有的特性。

1)const修饰成员变量
const修饰类的成员函数,表示成员常量,不能被修改,同时它只能在初始化列表中赋值。

    class A
    { 
        //…
        const int nValue;         //成员常量不能被修改
        //…
        A(int x): nValue(x) { } ; //只能在初始化列表中赋值
     } 

2)const修饰成员函数

const修饰类的成员函数,则该成员函数不能修改类中任何非const成员函数。一般写在函数的最后来修饰。

    class A
    { 
       void function()const; //常成员函数, 它不改变对象的成员变量.                        
		//也不能调用类中任何非const成员函数。
	}

对于const类对象/指针/引用,只能调用类的const成员函数,因此,const修饰成员函数的最重要作用就是限制对于const对象的使用。

a. const成员函数不被允许修改它所在对象的任何一个数据成员。

b. const成员函数能够访问对象的const成员,而其他成员函数不可以。

参考文献

https://blog.csdn.net/cherrydreamsover/article/details/79326505

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值