首页 > 编程语言 >C/C++中的const

C/C++中的const

时间:2024-11-21 20:15:45浏览次数:3  
标签:const 函数 int C++ 修改 num 修饰

1.在C语言中

 在C语言中,const 是一个关键字,用于修饰变量。
它的主要作用是定义常量,即被 const 修饰的变量的值不能被修改。

例如:

 const int a = 10;
//这里定义了一个整型常量 a ,尝试给 a 重新赋值(如 a = 20; )会导致编译错误。

const 也可以用于修饰指针。如果是 const 在 * 之前,如 const int *p ,表示指针 p 所指向的内容是常量,不能通过 p 来修改它指向的内容,但 p 本身可以指向其他地址;如果 const 在 * 之后,如 int * const p ,则表示指针 p 本身是常量,不能再指向其他地址,但可以通过 p 修改它指向的内容;如果写成 const int * const p ,那么 p 所指向的内容和 p 本身都不能被修改。

int const *p;//表示*p不能被修改

int *const p;//表示 p 不能被修改

const int *const p;//表示*p 和 p 都不能被修改

2.在C++中

在C++中, const 关键字和C语言中的类似,但也有一些拓展。
 
1). 定义常量
- 用于定义基本数据类型常量,如 const int num = 10; ,这里 num 的值在初始化后不能被改变。这有助于提高程序的安全性和可读性,避免意外修改数据,但是可以通过指针修改。

const int a=2;
const int *p=&a;
//首先将p从const类型的指针转换成非const:
int *p1=const_cast<int*>p;//const_cast是C++的四种强转类型之一,可以看我之前发过的文章
*pl=3;
cout<<*p<<" "<<*pl;


2). 修饰指针
-  const 修饰指针和C语言类似。 const int *p 表示 p 指向的内容是常量; int * const p 表示指针 p 本身是常量; const int * const p 表示 p 指向的内容和 p 本身都是常量。

#include<iostream>
using namespace std;
int mian()
{
const int *p;//*p不能被修改
int const *p2;
int a=2;
int *const p1=&a;//修饰p1不能被修改,并且p1必须要初始化


3). 修饰函数参数
- 当函数参数是 const 引用(如 void func(const int& n) )时,函数内部不能修改引用所绑定的对象。这在传递大型对象时可以避免复制开销,同时保证对象不被修改。
- 对于指针参数, const 也有类似作用。例如 void func(const char* str) ,函数内部不能通过 str 修改它所指向的字符串内容。
4). 修饰函数返回值
- 当函数返回值是 const 时,返回的对象不能被修改。例如 :const int& getValue() 返回一个 const 引用,调用这个函数得到的结果不能用于修改原对象。
5). 类中的const
- 在类中, const 成员函数是一个重要的概念。在 const 成员函数(如 void classA::func() const )中,不能修改类的非 const 成员变量。这保证了在调用 const 对象的成员函数时,对象的状态不会被意外改变。

注意:

在C++类中,const修饰成员函数时,此函数称为常函数,修饰对象,称为常对象

1.常函数

1).成员函数后加const修饰,此函数称为常函数

2).常函数内不可以修改成员属性,也不可以调用非常函数(类型不匹配)

3).成员属性声明时加上关键字mutable后,可以在常函数中被修改

4).如果两个函数名相同,参数相同,但是一个是常函数一个是非常函数,那么这两个函数为函数重载,非常对象优先调用非常函数,常对象只能调用常函数

5).常函数能修改静态成员变量,因为访问静态成员变量不需要this指针

6).常函数可以调用静态成员函数,因为静态成员函数没有this指针,this指针类型不冲突

7).常函数中的this:const A* const this

*this和this都被const修饰了,修饰*this意味着*this不能被修改

也就是这个对象不能在常函数中被修改(常函数不能修改成员变量原因)

2.常对象

1).声明对象前加const,此对象称为常对象

2).常对象只能调用常函数

3).常对象不能被修改,常对象只能调用常函数, 因为非常函数会修改常对象中的成员变量

4).非常对象允许被修改,非常对象既能调用非常函数, 又可以调用常函数,优先调用非常函数

#include<iostream>
using namespace std;
class A {
	int num;
	static int a;
public:
	A() {
		num = 1;
	}
	void set_num(int num) {
		this->num = num;
	}
	int get_num()const {//成员函数后加const修饰,变成常函数
		//this->num=3;常函数不能修改非静态成员变量,因为*this被const修饰了
		//set_num(2);常函数不能调用非常函数,类型不匹配
		a = 3;//常函数能修改静态成员变量,因为访问静态成员变量不需要this指针
		//常函数可以调用静态成员函数,因为静态成员函数没有this指针,this指针类型不冲突
		cout << " 常函数" << endl;
		return this->num;//this:const A* const this
		/*常函数中的this:const A* const this
		*this和this都被const修饰了,修饰*this意味着*this不能被修改
		也就是这个对象不能在常函数中被修改(常函数不能修改成员变量原因)*/
	}
	int get_num() {
		//因为常函数和非常函数中的this指针类型不同,所以他们互为重载关系
		cout << "非常函数" << endl;
		return 0;
	}
};
int A::a = 2;
int main() {
	/*常对象不能被修改,常对象只能调用常函数,
	因为非常函数会修改常对象中的成员变量*/
	/*非常对象允许被修改,非常对象既能调用非常函数,
	又可以调用常函数,优先调用非常函数*/
}

标签:const,函数,int,C++,修改,num,修饰
From: https://blog.csdn.net/2401_88249494/article/details/143895834

相关文章

  • C++中的移动语义
    一、移动语义1.定义:在C++中,移动语义是一种优化技术。移动语义允许资源的“移动”而不是“拷贝”。在传统的C++中,当一个对象被赋值或传递给函数时,通常会发生拷贝操作,这会导致性能下降,尤其是在处理大型对象时。移动语义通过引入右值引用和移动构造函数、移动赋值运算符,允许......
  • 【C++学习笔记】一个先学了Java,Python,Csharp最后再来学C++的菜狗笔记
    1.字符串1.char数组charstr[]="helloworld";可以使用cstring库中的函数(如strlen,strcpy)。2.string类型#include<string>stringstr="helloworld";与csharp,java等语言不同的是动态分配内存,由标准库管理。支持操作符重载(如+,==等)。std::string是可变的,类似......
  • C++系统教程007-数据类型06(cin输入语句)
    练习:1.控制输出精确度本实例中,定义一个整型变量并赋值,定义一个双精度变量并赋值,利用cout输出这两个不同精度的格式。//控制精度#include<iostream>usingnamespacestd;intmain(){ intx=123; doubley=3.1415; cout<<"x="; cout.width(10);//设置输出域宽为10 ......
  • C++11-chrono时间库解析
    目录一、具体作用用途二、C++std::chrono时间库概述2.1、std::chrono命名空间的作用和用途2.2、基本组成部分:duration、time_point和clock三、duration的使用详解3.1、duration表示时间段的概念和使用方法3.2、duration的各种单位和精度选项3.3、使用示例四、time_p......
  • 【C++】类和对象-深度剖析默认成员函数-下
     >......
  • C++指针函数体内部初始化需要注意的地方
    有如下代码:voidchangePtr(int*p){*p=4;}intmain(){int*p=newint(5); changePtr(p);cout<<"*p:"<<*p<<endl;}以上代码我们都知道传递指针,函数改变了指针指向地址内的数据,函数体外部调用时p指向地址发生了改变,输出结果由5->4。但是在......
  • VC++ 中的宏 (#define) 与预处理 (#if/#ifdef/#pragma) 的使用总结
    关键字:宏,预定义宏,预处理,预编译头,VC,#pragma,编译选项,程序区段目录C/C++预定义宏例子:C/C++预定义宏的取值C/C++预定义宏用途:诊断与调试输出CRT的诊断与调试输出:assert,_ASSERT/_ASSERTE,_RPTn/_RPTFn/_RPTWn/_RPTFWnMFC的诊断与调试输出:ASSERT/VERIFY,ASSERT_V......
  • C++:类的继承
    在C++中,类的继承是一种面向对象编程(OOP)的重要特性,它允许一个类(子类或派生类)继承另一个类(基类或父类)的属性和方法。通过继承,可以重用现有的代码,减少重复代码,提高代码的可维护性和扩展性。1.基本概念基类(BaseClass或ParentClass):被继承的类。派生类(DerivedClass或Chi......
  • C++最佳情侣身高差 2024年9月c++一级 电子学会中小学生软件编程C++等级考试一级真题答
    目录C++最佳情侣身高差一、题目要求1、编程实现2、输入输出二、算法分析三、程序编写四、程序说明五、运行结果六、考点分析C++最佳情侣身高差2024年9月C++编程等级考试一级编程题一、题目要求1、编程实现专家通过多组情侣研究数据发现,最佳的情侣身高差遵循......
  • 初识C++
    目录1.C++发展历史2.C++在工作领域中的应用3.第一个C++程序3.1梦开始的地方:打印helloworld4.命名空间4.1namespace的价值4.2namespace的定义4.3命名空间的使用5.C++输入&输出6.缺省参数7.函数重载8.引用8.1引用的概念的定义8.2引用的特性8.3引......