C++之函数处理数组和const指针

一 const 保护数组

#include <iostream>

using namespace std;

void modify(const int a[])
{
	a++;
	//a[0] += 10;
}

int main()
{

	return 0;
}

二、const与指针

#include <iostream>]

using namespace std;

int main()
{
	int k = 99;
	const int *p;
	p = &k;
	//(*p)++ ;invalid

	const int ci = 999;
	p = &ci;//const value to const pointer
	//int *pi = &ci; invalid
	return 0;
}

这种情况在函数传参是尤其要注意。应当尽可能地使用const,因为这样既能保护数据,也能接受const和非const类型的数据。
另外

#include <iostream>]

using namespace std;

int main()
{
	int age = 50;
	const int *p = &age;
	//(*p) += age; can not change the value of age;
	int const *pp = &age;
	int nage = age;
	//pp = nage; can not change the value of the pointer
	return 0;
}
### C++函数指针数组与 `const` 关键字结合使用的说明 在 C++ 编程中,当涉及到函数指针数组并希望利用 `const` 来增强程序的安全性清晰度时,可以通过多种方式来实现这一点。下面将详细介绍几种不同的场景及其对应的语法结构。 #### 场景一:只读的函数指针数组 如果目标是创建一个不可修改其成员指向的函数地址的函数指针数组,则可以在声明该数组时加上顶层 `const`: ```cpp // 定义两个简单整数到整数转换函数作为例子 int addOne(int n) { return n + 1; } int doubleValue(int n) { return n * 2; } // 声明一个包含两个元素的函数指针数组,并初始化它们分别指向addOnedoubleValue void example1() { int (*const funcPtrArray[])(int) = {addOne, doubleValue}; // 下面这行会报错,因为funcPtrArray本身被标记为了const // funcPtrArray[0] = nullptr; } ``` 此代码片段展示了如何通过给整个数组加 `const` 属性使其成为只读状态[^2]。 #### 场景二:指向常量返回类型的函数指针数组 有时可能需要一组函数都返回相同类型的常数值,在这种情况下应该让每个函数指针对应于具有特定签名——带有 `const` 返回值类型——的函数: ```cpp // 修改之前的函数以返回const int* const int* getConstIntPointer(const int& value) { static const int result = value; return &result; } // 创建一个存储上述类型函数指针数组 void example2() { const int* (*funcPtrArray[])(const int&) = {getConstIntPointer}; // 调用其中一个函数并通过参数传递具体值 auto ptr = funcPtrArray[0](42); cout << "*ptr=" << *ptr << endl; // 尝试改变所指向的内容将会失败编译 //*ptr = 99; // 错误: cannot assign to variable 'ptr' with const-qualified type 'const int' } ``` 这里强调了即使我们试图更改由这些函数产生的结果也不会成功,因为已经明确了返回的对象为不可变对象[^3]。 #### 场景三:完全限定的 `const` 函数指针数组 最后一种情况是对函数指针本身的定义施加更严格的约束条件,即不仅防止重定位(重新分配),而且也阻止调用者间接地经由此路径去篡改原始数据源中的任何东西: ```cpp // 构建一系列接受固定输入但不改变内部状态的操作符 class Calculator { public: static const int multiplyByTwo(const int x) {return x * 2;} static const int squareTheNumber(const int y) {return y * y;} }; // 初始化一个含有多个此类静态成员函数函数指针列表 void example3() { typedef const int (Calculator::*FuncType)(const int)const; FuncType const funcPtrArray[] = {&Calculator::multiplyByTwo,&Calculator::squareTheNumber}; Calculator calcInstance; for(auto&& fn : funcPtrArray){ cout<<calcInstance.*fn(5)<<endl; } } ``` 在这个实例里,所有的操作都被严格限制在一个安全范围内工作,没有任何副作用影响外部环境或者破坏原有逻辑的一致性[^4]。 综上所述,合理运用 `const` 可以为涉及复杂的数据交换机制提供额外保护层的同时保持良好的可维护特性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值