C 中的常量限定符和 C++ 中的常量限定符有什么区别?
What is the difference between the const qualifier in C and the const qualifier in C++?
我找到了用户R..的评论:
C 和 C++ 不是同一种语言。特别是,C
const
与C++const
无关。
我知道,C 中的const
限定符和 C++ 中的const
限定符之间的一个区别是它的默认链接。
在命名空间范围内声明const
C++限定符的对象具有内部链接,而在 C 中,在全局范围内声明了const
限定符的对象(在const
之前没有static
限定符(具有外部链接。
但是,在C语言和C++语言之间,它们还有什么区别呢?我认为两者在两种语言中都有相同的概念和目的。
我的问题:
- C 中的常量限定符和 C++ 中的常量限定符有什么区别?
"const"在C和C++中有何不同?的答案并没有在const
限定符的上下文中指出C语言和C++语言之间的确切差异。只有你不能或可以用某种语言做的事情。
-
最重要的区别是,在C++中,
const
变量是一个常量表达式(甚至在引入 C++11constexpr
之前(,但 C 中的const
变量不是。这意味着C++允许你做类似
const size_t n = 1; static int array[n];
的事情,但 C 不允许这样做,据说是出于历史原因。 -
在C++,
const
在确定联系方面发挥着作用。这在C++版本之间是不同的。根据 cppreference.com(强调我的(:在命名空间范围内声明的以下任何名称都具有内部链接:
非- 易失性 非模板(自 C++14 起( 非内联(自 C++17 起( 非导出(自 C++20 起( 未声明为 extern 且之前未声明为具有外部链接的 const限定变量(包括 constexpr(;
而在 C 语言中,
const
根本不参与确定链接 - 只有声明范围和存储类说明符很重要。 -
在C++中,您可以
const
限定成员函数。这在 C 中是不可能的,因为它没有对成员函数的语法支持。 -
C 允许在没有初始值设定项的情况下声明
const
限定变量。在 C 中,我们可以编写没有初始值设定项的const int x;
,但C++不允许这样做。乍一看,这似乎是 C 语言中毫无意义的语言错误,但基本原理是计算机具有只读硬件寄存器,其值由硬件而不是软件设置。这意味着 C 仍然适用于与硬件相关的编程。
从 cppreference.com:
在声明未声明的非局部非易失性非模板(自 C++14 起(非内联(自 C++17 年以来(变量
extern
声明时使用的const
限定符为其提供了内部链接。这与 C 不同,Cconst
文件范围变量具有外部链接。
除此之外,const
在 C 和 C++ 中具有相同的语义,带有const
的 C 标头通常被编译为具有条件"extern C"
的 C++ 标头。
- 返回常量对象引用 (getter) 和仅返回字符串有什么区别?
- C 中的常量限定符和 C++ 中的常量限定符有什么区别?
- 空指针常量 (nullptr)、空指针值和空成员指针值之间有什么区别?
- 函数签名与调用的函数不匹配,常量字符[]和字符*之间的区别?
- 常量引用和引用之间的区别
- C++ 对非常量对象的常量引用和对非常量对象的非常量引用之间的区别
- 常量映射和常量元素映射之间的区别
- 常量成员和没有setter的私有成员之间有什么区别
- 有没有办法声明一个公共静态常量,该常量将使用 constexpr 在源文件中定义(有什么区别)?
- 有什么区别 - 常量 int x = 5000;和常量整数 x = 50'00;在C++?
- c++ 类中的静态常量变量和常量变量在存储方面是否有区别
- 常量字符 [] 和常量字符*之间的区别
- const_iterator<T>和迭代器<常量T>有什么区别?
- C/C++ 中的常量数组和静态常量数组有什么区别
- 可修改的右值和常量右值有什么区别?
- 模板推导中的常量T&和T&有什么区别
- 常量和非常量成员函数之间的主要区别
- C++中的临时变量和常量有什么区别
- 常量和constexpr指针之间的区别
- 声明"静态常量"和"常量静态"有什么区别