const的常见用法

本文详细介绍了C++中const关键字的多种常见用法,包括定义常量变量、保护传参时不被修改、节约内存空间、类中使用const修饰函数防止修改非static类成员变量、修饰指针、修饰函数返回值防止被改变、修饰类的成员变量以及const对象变量的作用与限制。同时,阐述了const对象变量的作用域仅限于当前C/C++文件,并且提供了实例代码以加深理解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

 const用法主要是防止定义的对象再次被修改,定义对象变量时要初始化变量

 

下面我就介绍一下几种常见的用法

1.用于定义常量变量,这样这个变量在后面就不可以再被修改

 const int Val = 10;

 //Val = 20; //错误,不可被修改

 

2. 保护传参时参数不被修改,如果使用引用传递参数或按地址传递参数给一个函数,在这个函数里这个参数的值若被修改,

则函数外部传进来的变量的值也发生改变,若想保护传进来的变量不被修改,可以使用const保护

 void  fun1(const int &val)

  {

     //val = 10; //出错

}

void fun2(int &val)

{

   val = 10; //没有出错

}

void main()

{

   int a = 2;

   int b = 2;

   fun1(a); //因为出错,这个函数结束时a的值还是2

   fun2(b);//因为没有出错,函数结束时b的值为10

}

如果只想把值传给函数,而且这个不能被修改,则可以使用const保护变量,有人会问为什么不按值传递,按值传递还需要把这个值复制一遍,

而引用不需要,使用引用是为了提高效率//如果按值传递的话,没必要加const,那样根本没意义

 

3. 节约内存空间,

 #define  PI  3.14 //使用#define宏

 const double Pi = 3.14 //使用const,这时候Pi并没有放入内存中

 

 double  a = Pi;  //这时候才为Pi分配内存,不过后面再有这样的定义也不会再分配内存

 double  b = PI;  //编译时分配内存

 double  c = Pi;  //不会再分配内存,

 double  d = PI;  //编译时再分配内存

const定义的变量,系统只为它分配一次内存,而使用#define定义的常量宏,能分配好多次,这样const就很节约空间

 

4.类中使用const修饰函数防止修改非static类成员变量

 class

{

 public:

  void fun() const //加const修饰

   {

     a = 10; //出错,不可修改非static变量

     b = 10; //对,可以修改

}

 private:

  int  a ;

  static int b;

}

 

5.修饰指针
const int *A; 或 int const *A;  //const修饰指向的对象,A可变,A指向的对象不可变
int *const A;               //const修饰指针A, A不可变,A指向的对象可变
const int *const A;           //指针A和A指向的对象都不可变

 

 

6.修饰函数返回值,防止返回值被改变

  const int fun();

  接收返回值的变量也必须加const

  const int a = fun(); //接收的变量也要是const的,int a = fun()是错误的

 

7.修饰类的成员变量

  使用const修饰的变量必须初始化,在类中又不能在定义时初始化,

如;

class

{

private:

  int a = 10;

  const int b = 10;

  static const int c = 10;

//这样初始化都是错的,

}

 

初始化const int类型(没有static),在类的构造函数上初始化

Class Test

{

Public:

  Test():b(23) //构造函数上初始化b的值为23

   {

}

private:

     const int b ;

}

 

初始化staticconst int这个类型的(带有static的),在类的外面初始化

class Test

{

private:

  static const int c;

} 

const int Test::c=10; //类的外部初始化c为10

 

8.const定义的对象变量只能作用于这个程序该C/C++文件,不能被该程序的其他C/C++文件调用,

 如file1.cpp中 const int val;

 在file2.cpp中, extern intval; //错误,无法调用,

要想const定义的对象变量能被其他文件调用,定义时必须使用extern修饰为

extern const int val;

 

非const变量默认为extern,要是const能被其他文件访问必须显示指定为extern

 

 

<think>首先,用户的问题是:“我想了解const_cast的常见用法请问const_cast用法示例C++”。这是关于C++中const_cast操作符的用法和示例。我需要参考系统级指令:-所有行内数学表达式使用$...$格式,但这里没有数学内容,所以可能不需要。-独立公式使用$$...$$并单独成段,但同样,这里可能不适用。-LaTeX语法正确:确保任何公式或代码正确。-使用中文回答:整个回答要用中文。-生成相关问题:在回答结束后,生成相关问题。-回答中引用的段落末尾添加引用标识:参考提供的引用,在相关内容后添加[^n]。用户可见层指令:-回答结构清晰,逐步解决问题。-保证回答真实可靠:基于我的知识和提供的引用。提供的引用是关于C++类型转换的,特别是const_cast:-[^1]:示例使用const_cast去除const限定符。-[^2]:解释const_cast用于去除const或volatile限定符。-[^3]:另一个示例,展示了修改const变量可能导致未定义行为。-[^4]:const_cast的作用是修改类型的常量性。-[^5]:概述C++的四种类型转换。用户需求:了解const_cast的常见用法和示例。我的回答结构:1.**介绍const_cast**:简要解释什么是const_cast及其主要用途。2.**常见用法**:列出常见的应用场景。3.**示例**:提供代码示例,展示如何使用。4.**注意事项**:提醒潜在风险,如未定义行为。5.**生成相关问题**:在结尾添加相关问题。确保使用中文。步骤:-**开头**:直接回应用户问题。-**主体**:-解释const_cast:基于引用[^2]和[^4]。-常见用法:如去除const限定符以修改数据,但强调谨慎使用。-示例:使用引用[^1]和[^3]中的代码,但要改编成更清晰的例子。-**结尾**:总结并添加相关问题。引用标识:当引用具体内容时,在段落末尾添加[^n]。例如,如果基于引用[^2]解释,添加[^2]。生成相关问题:-类似示例中的结构:列出3-4个相关问题。最终输出格式:-回答部分。-§§相关问题§§部分。现在,草拟内容:###介绍const_cast是C++中的类型转换操作符,用于去除变量的const或volatile限定符[^2]。这允许修改原本被声明为常量的数据。###常见用法1.**去除const限定符**:当函数参数是const指针或引用时,如果需要修改数据,可以使用const_cast[^4]。2.**接口兼容**:在调用第三方库或API时,可能需要传递非const数据到期望const的函数中,反之亦然。3.**volatile限定符**:类似地,去除volatile限定符,但较少见。###注意事项-**未定义行为**:如果原始变量是真正常量(如声明为const的变量),修改它可能导致未定义行为[^3]。-仅在必要时使用,因为违反const语义可能导致错误。###示例基于引用[^1]和[^3],提供一个简单示例:```cpp#include<iostream>voidmodifyConst(constint*ptr){//使用const_cast去除const限定符int*mutablePtr=const_cast<int*>(ptr);*mutablePtr=100;//修改值std::cout<<"Modifiedvalue:"<<*mutablePtr<<std::endl;}intmain(){intnum=10;constint*constPtr=&num;//指向常量整数的指针std::cout<<"Originalvalue:"<<num<<std::endl;modifyConst(constPtr);std::cout<<"Aftermodification:"<<num<<std::endl;//输出修改后的值//警告:如果num是真正的const变量,这会导致未定义行为return0;}```在这个例子中,num不是const,所以修改是安全的。但如果num是constintnum=10;,则行为未定义[^3]。###另一个示例(字符串)```cpp#include<iostream>#include<string>voidchangeName(conststd::string&name){std::string&mutableName=const_cast<std::string&>(name);mutableName="Bob";std::cout<<"Newname:"<<mutableName<<std::endl;}intmain(){std::stringname="Alice";changeName(name);std::cout<<"Nameafterchange:"<<name<<std::endl;//输出"Bob"return0;}```这里,name不是const,所以修改成功[^1]。###总结const_cast应谨慎使用,只在不改变原始常量性的安全场景下。###相关问题生成3-4个相关问题。</think>### const_cast 常见用法及示例(C++) `const_cast` 是 C++ 中的类型转换操作符,专门用于去除变量的 `const`(常量)或 `volatile`(易变)限定符[^2]。它允许修改原本被声明为常量的数据,但需谨慎使用,否则可能导致未定义行为[^3]。以下是常见用法和代码示例: #### 常见用法场景 1. **修改常量数据**:当函数接收 `const` 参数但需要临时修改时(如兼容旧代码或特定接口)[^4]。 2. **接口适配**:调用期望非 `const` 参数的第三方函数时,对 `const` 数据进行安全转换[^2]。 3. **移除 `volatile` 限定符**:较少见,用于硬件编程等场景[^5]。 #### 代码示例 以下示例展示 `const_cast` 的基本用法,注意安全性和潜在风险: **示例 1:安全修改非原始常量数据** ```cpp #include <iostream> void updateValue(const int* src) { // 使用 const_cast 去除 const 限定符 int* modifiable = const_cast<int*>(src); *modifiable = 42; // 安全修改(src 指向的数据非原始常量) std::cout << "更新后的值: " << *modifiable << std::endl; } int main() { int value = 10; // 原始变量非 const updateValue(&value); std::cout << "主函数中的值: " << value << std::endl; // 输出 42 return 0; } ``` - **说明**:`value` 未声明为 `const`,转换后修改是安全的[^1]。 **示例 2:风险场景(未定义行为)** ```cpp #include <iostream> void unsafeModify(const int* src) { int* mutablePtr = const_cast<int*>(src); *mutablePtr = 100; // 危险!原始数据是常量 } int main() { const int num = 5; // 原始常量 unsafeModify(&num); std::cout << "修改结果: " << num << std::endl; // 输出可能仍为 5(未定义行为)[^3] return 0; } ``` - **关键点**:修改原始 `const` 变量(如 `num`)会导致未定义行为,编译器可能忽略修改或崩溃[^3]。 **示例 3:字符串修改(引用类型)** ```cpp #include <iostream> #include <string> void changeName(const std::string& nameRef) { // 转换为非 const 引用 std::string& mutableRef = const_cast<std::string&>(nameRef); mutableRef = "Charlie"; std::cout << "新名称: " << mutableRef << std::endl; } int main() { std::string name = "Alice"; changeName(name); std::cout << "最终名称: " << name << std::endl; // 输出 "Charlie" return 0; } ``` - **应用场景**:适用于对象引用,需确保原始数据非 `const`[^1]。 #### 注意事项 - **仅用于指针/引用**:`const_cast` 不改变对象本身类型,只影响访问权限[^4]。 - **避免滥用**:优先使用 `const` 正确性设计,仅在必要时转换[^5]。 - **未定义行为风险**:修改原始常量数据是未定义的,可能导致程序崩溃或数据不一致[^3]。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值