【C/C++基础】const 关键字

本文详细解释了C++中const关键字的作用,包括常量变量、初始化规则,以及常量指针、指针常量的区别。还介绍了常量引用在函数参数传递、遍历容器和返回值类型的用途。同时讲解了const修饰类成员函数的目的和最佳实践。
摘要由CSDN通过智能技术生成

Q&A and 前言

Q:简要说一说 C++ 中的 const 关键字,含义以及常见的使用位置

A:const 是 C++ 中的一种关键字,用来对变量加以限制,无法被修改,额…

Q:具体说一下常量指针与指针常量,以及你是如何区分的

A:常量指针是 const pointer,指针常量是 pointer to const,额…

Q:好的,今天的面试到此结束,出去把门带上…


const 关键字是 C++程序语言开发岗位 面试经常考察的一个知识点,这个问题牵涉的考察面特别广,从 const 能问到指针、指针常量、常量指针、指向常量的常量指针、常量引用、常函数,甚至能问到函数的几种传参形式。今天就来看一看 const 关键字的几种用法。

const 修饰基本变量

有时候我们想定义一种值不能被改变的变量。例如,用一个变量来表示缓冲区的大小。使用变量的好处是当我们觉得缓冲区的大小不合适的时候,很容易可以对其进行调整。另一方面,我们应该防止程序一不小心改变了这个值。为了满足这一要求,可以将这一变量定义为 const 类型加以限制:

const int bufferSize = 512;

这样就把 bufferSize 定义成一个常量。任何试图为 bufferSize 赋值的行为都会引发错误。

初始化

const 是英文单词 constant 的缩写形式,表示常数、恒定的意思。使用该关键字修饰变量表示变量是恒定的,不可以改变的。因为 const 对象一旦创建后其值不能被改变,所以 const 对象必须初始化。初始值可以是任何复杂的表达式:

const int i = get_size();  // 正确:运行时初始化
const int j = 42;		  // 正确:编译时初始化
const int k;			  // 错误:没有初始化

不论是常量对象还是非常量对象都可以初始化常量对象,同样的普通对象也可以使用常量对象进行初始化。

int i = 42;
const int ci = i;		// 正确:i的值被拷贝给了 ci
int j = c1;			    // 正确:ci 的值被拷贝给了 j

尽管 ci 是整型常量,但无论如何 ci 中的值还是一个整型数。ci 的常量特征仅仅在执行改变 ci 的操作时才会发挥作用。当用 ci 去初始化 j 时,根本无须在意 ci 是不是一个常量。

const 对象仅在文件内有效

当以编译器初始化的方式定义一个 const 对象时:

const int bufferSize = 512;

编译器将在编译过程中把用到 bufferSize 的地方都替换为 512.

为了执行上述替换,编译器必须知道变量的初始值,如果程序包含多个文件,则每个用了 const 对象的文件必须得能访问到它的初始值才行。要做到这一点,就必须在每一个用到变量的文件中都有对它的定义。为此,在默认情况下,const 对象被设定为仅在文件内有效。当多个文件中出现同名的 const 变量时,其实等于在不同的文件中分别定义了独立的变量。

有些时候,我们希望在一个文件中定义 const 变量,在其他文件中声明并使用。解决的方法是,对于 const 变量不管是声明还是定义都增加 extern 关键字,这样只需要定义一次就可以了:

// file1.cpp 定义并初始化一个常量,该常量能被其他文件访问
extern const int bufferSize = fcn();
// file2.h
extern const int bufferSize;	// 与 file1.cpp 中定义的 bufferSize 是同一个

如果想在多个文件之间共享 const 对象,必须在变量的定义之前添加 extern 关键字。

const 的引用

引用可以绑定在常量对象上,也可以绑定在非常量对象上。无论引用的对象是常量还是非常量都不会影响引用和对象的绑定关系本身。只有那些不能通过引用改变它绑定的对象的引用,才被称为常量引用。换言之,常量运用不能通过引用改变它绑定的对象。

常量引用仅对引用可参与的操作做出了限定,对于引用的对象本身是不是一个常量未做限定。因为对象可能是个非常量,所以允许通过其他途径改变它的值:

int i = 42;
int &r1 = i;		// 引用 r1 绑定对象 i
const int &r2 = i;	// r2 也绑定对象 i,但是不允许通过 r2 修改 i 的值
r1 = 0;				// r1 并非常量,可以通过引用 r1 修改 i
r2 = 0;				// 错误:r2 是一个常量引用

应用

常量引用主要用于以下几种情况:

函数参数传递:在函数定义中,使用常量引用作为参数,可以确保传递给函数的参数不会被修改,并且避免了不必要的数据复制。

void myFunction(const int& x) {
    // 在函数中不能修改 x 的值
    // 可以安全地使用 x
}

遍历容器:使用范围 for 循环遍历容器时,如果不需要修改容器的元素,可以使用常量引用来提高性能并确保容器不会被修改。

std::vector<int> numbers = {1, 2, 3, 4, 5};
for (const auto& num : numbers) {
    // 通过常量引用遍历容器,避免了不必要的复制,并确保容器不会被修改
}

返回值类型:在函数返回引用类型时,如果返回的对象是常量且不应该被修改,可以使用常量引用作为返回类型,以避免不必要的复制。

const std::string& getMessage() {
    static std::string message = "Hello, world!";
    return message; // 返回常量引用,避免了不必要的复制,并确保返回的对象不会被修改
}

总的来说,常量引用是一种有效的方式,用于提高性能、确保数据的不可修改性,并避免不必要的数据复制。对于确定不需要修改的对象,建议写成常量引用的形式。

指针与 const

指针与 const 主要包括以下内容:

  • pointer to const
  • const pointer
  • const pointer points to const

如果对这些内容已经了然于胸,完全可以跳过这一小节,如果有不清楚的地方,可以参考 【C/C++基础】指针与const

const 修饰类成员函数

在自定义的数据类型(类)中,常常会发现某些成员函数的函数参数列表之后有 const 关键字,这样的成员函数被称为常量成员函数。

const 修饰类成员函数,其目的是防止成员函数修改被调用对象的值,如果我们不想修改一个调用对象的值,所有的成员函数都应当声明为 const 成员函数,这也是建议的写法。

参考

《C++ Primer 中文(第5版)》

写在最后

如果您发现文章有任何错误或者对文章有任何疑问,欢迎私信博主或者在评论区指出 💬💬💬。

如果大家对 const 有更完整的整理或更清晰的认识,欢迎评论区交流。

最后,感谢您的阅读,如果有所收获的话可以给我点一个 👍 哦。

  • 10
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wang_nn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值