简介 const 与 static 的全部用法

本文深入解析了优快云博客中关于常量、变量、指针和静态作用域的概念。通过具体实例阐述了const关键字的使用,包括const int A;常量const int * pA;指向常量的指针;int const * pA;常量指针。同时介绍了静态作用域与命名空间的区别。提供了关于const、指针和静态作用域的详细解释。

http://blog.youkuaiyun.com/newstudent_never/article/details/6381675



const,先说变量
const int A; 常量
const int*  pA; 指向常量的指针。 (*pA)++ 错误,不允许改变常量, 但是 pA = &D 可以改变指向的对象。与int* const pA等价
int const  *pA; 常量指针,指向int。(*pA)++ 允许, 但不可以改变指向,既 pA = &D 错误。

与const int  *pA等价

函数 
const int a(); 返回常量
int const * a(); 返回常量指针
const int* a(); 返回指向常量的指针
int a(int b) const; 函数中不允许改变b的值

 

另外还有更多的
const int nB = 10;
const int const * PA = &B;

 


const int const * funA(const int * pBuf) const;
返回指向常量的常指针,函数中(*pBuf)++和pBuf=&D都不允许

 

 

static 静态作用域, 修饰函数中的变量时 说明只赋值一次,并且保留上一次的结果
修饰全局函数或变量时, 说明作用域只针对于这个文件, 与c++中的命名空间 namespace 有点像,
只不过 命名空间可以扩充到多个文件中

C++ 中,`const` 和 `static` 是两个常见的关键字,它们有不同的用途: ### const 关键字的用法 - **修饰变量**:`const` 修饰的变量表示常量,一旦初始化后其值不能被修改。 ```cpp const int num = 10; // num = 20; // 错误,不能修改常量的值 ``` - **修饰指针**:可以分为常量指针和指针常量。常量指针指向的内容不能被修改,但指针本身可以指向其他地址;指针常量指针本身的地址不能改变,但指向的内容可以修改。 ```cpp int a = 10, b = 20; const int* p1 = &a; // 常量指针 // *p1 = 20; // 错误,不能修改指向的内容 p1 = &b; // 正确,指针可以指向其他地址 int* const p2 = &a; // 指针常量 *p2 = 20; // 正确,指向的内容可以修改 // p2 = &b; // 错误,指针本身的地址不能改变 ``` - **修饰函数参数**:当函数参数被 `const` 修饰时,表示在函数内部不能修改该参数的值。 ```cpp void func(const int x) { // x = 20; // 错误,不能修改参数的值 } ``` - **修饰成员函数**:`const` 成员函数的主要目的是防止成员函数修改对象的内容。`const` 关键字和 `static` 关键字对于成员函数来说不能同时使用,因为 `static` 关键字修饰静态成员函数不含有 `this` 指针,而 `const` 成员函数又必须具体到某一个对象 [^2]。 ```cpp class MyClass { public: int value; void setValue(int val) { value = val; } int getValue() const { return value; } // const 成员函数 }; ``` ### static 关键字的用法 - **修饰全局变量和函数**:`static` 修饰的全局变量和函数的作用域仅限于当前文件,其他文件无法访问。 ```cpp // file1.cpp static int globalVar = 10; // 静态全局变量 static void staticFunc() {} // 静态函数 // file2.cpp // 无法访问 file1.cpp 中的 globalVar 和 staticFunc ``` - **修饰局部变量**:`static` 修饰的局部变量在函数调用结束后不会被销毁,而是保留其值。 ```cpp void func() { static int count = 0; count++; std::cout << count << std::endl; } ``` - **修饰类的数据成员**:用 `static` 修饰类的数据成员实际使其成为类的全局变量,会被类的所有对象共享,包括派生类的对象。因此,`static` 成员必须在类外进行初始化(初始化格式:`int base::var = 10;`),而不能在构造函数内进行初始化,不过也可以用 `const` 修饰 `static` 数据成员在类内初始化 [^3]。 ```cpp class Base { public: static int var; // 静态数据成员 static const int constVar = 20; // 用 const 修饰的静态数据成员可以在类内初始化 }; int Base::var = 10; // 静态数据成员在类外初始化 ``` - **修饰类的成员函数**:`static` 修饰的类成员函数属于整个类,而不是某个对象,因此它没有 `this` 指针。静态成员函数只能访问静态数据成员和其他静态成员函数。 ```cpp class MyClass { public: static int count; static void printCount() { std::cout << count << std::endl; } }; int MyClass::count = 0; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值