举个例子 const int limit = 500; const int * const cpci = &limit; const int * const * pcpci = &cpci; 我很难理解最后一行的含义. 基本上在数组术语中,值 pcpci 只是 (const int * const) 的数组.但我似乎无法在 pcpci 内制作多个副本,因为它不应该是一个常量指针. 举例 const int limit = 500; const int * const cpci = &limit; const int * const * pcpci = &cpci; const int limit2 = 600; const int * const cpci2 = &limit2; *(pcpci+1) = &cpci2; 在上面代码的最后一行我得到“错误左值必须是可修改的".但我想知道为什么会发生这种情况,因为 pcpci 不是常量指针,只有它的元素应该是常量且不
以下是关于 const 的编程技术问答
在PHP中,你什么时候使用 define('FOO', 1); 你什么时候使用 const FOO = 1; ? 这两者之间的主要区别是什么? 解决方案 从 PHP 5.3 开始,有两种方法可以 定义常量:使用 const 关键字或使用 define() 函数: const FOO = 'BAR'; define('FOO', 'BAR'); 这两种方式的根本区别在于 const 在编译时定义常量,而 define 在运行时定义它们.这导致了 const 的大部分缺点.const 的一些缺点是: const 不能用于有条件地定义常量.要定义一个全局常量,它必须在最外层范围内使用: if (...) { const FOO = 'BAR'; // Invalid } // but if (...) { define('FOO', 'BAR'); // Valid } 你为什么要这样做?一种常见的应用是检查常量是否已经定义:
问 题 最近在学习C++ Primer 5th(英文版), 函数(章节6),P.216。这里有一个例子如下: voide fcn(const int i) //fcn can read but not write to i。 按照书上自己的定义(P.203),函数的形参和实参的类型必须是匹配的,或者有形参的隐式转换。那么对这个例子来说,我的思路是: 这里是值传递,那么fcn会创建一个实参的拷贝parameter。 如果这个parameter 是const int类型,那么很显然这个复制是不能完成的。(const 因此那么这个parameter 只能是普通的int类型,top_level const被忽略掉了。 我写了一段代码来测试,编译器报错说不能对只读形参操作。 #include using namespace std; void const_parameter(const int i); int main(int ar
我想知道 volatile 关键字与注册, const 和静态的不同用法,关键字。我不知道是什么影响,所以我想: 注册volatile int T = 10; 建议编译器将T存储在寄存器中,T的值可以从外部OS,硬件,另一个线程) const volatile int T = 10; 程序本身不能修改T,但是T可以在代码之外的地方修改。 p> static volatile int T = 10; 如果T是类的数据成员,则表示类的所有对象都具有相同T和T的值可以从外部修改。如果T是文件中的全局变量,则其他文件(作为项目的一部分)中的源代码无法访问T,但是T可以从外部访问。如果T是一个函数中的局部变量,一旦它被初始化,就会保留在内存中,直到程序结束,并且可以从外部修改。 思想是正确的,任何经验丰富的C ++开发人员都可以给出一个例子,上面的例子可能在现实世界的应用程序中使用,或者是非常罕见的。
任何只包含 return 语句的函数都可以被声明constexpr 因此将允许在编译时进行评估,如果所有参数是 constexpr 并且仅在其中调用 constexpr 函数身体.有什么理由不声明任何这样的函数constexpr? 例子: constexpr int sum(int x, int y) { return x + y; } constexpr i = 10; static_assert(sum(i, 13) == 23, "sum correct"); 谁能提供一个声明函数的例子constexpr会造成什么伤害吗? 一些初步的想法: 即使没有充分的理由去声明一个函数不是 constexpr 我可以想象 constexpr 关键字有一个过渡角色:它在不需要编译时的代码中不存在评估将允许不实现编译时的编译器评估仍然编译该代码(但在代码上可靠地失败这需要它们,通过使用 constexpr) 来明确说明. 但我不明白的是:如果没有充分的理由
如何将 std :: string 转换为 char * 或 const char * ? 解决方案 如果你只想传递 std :: string 到需要 const char * 您可以使用 std :: string str; const char * c = str.c_str(); 如果要获得可写副本,例如 char * ,你可以这样做: std :: string str; char * writable = new char [str.size()+ 1]; std :: copy(str.begin(),str.end(),writable); writable [str.size()] ='\0'; //不要忘记终止0 //使用完后不要忘记释放字符串 delete [] writable; 编辑:请注意,上述操作不是例外安全的。如果 new 调用和 delete 调用throws之间的
我想为一个类(在本例中为 shape-factory)提供一个私有静态常量.我想要这样的东西. class A { private: static const string RECTANGLE = "rectangle"; } 不幸的是,我从 C++ (g++) 编译器中得到了各种错误,例如: ISO C++ 禁止初始化成员“矩形" 非整数类型“std::string"的静态数据成员的类内初始化无效 错误:将“矩形"设为静态 这告诉我这种成员设计不符合标准.您如何在不必使用#define 指令的情况下拥有私有文字常量(或者可能是公共的)(我想避免数据全局性的丑陋!) 感谢任何帮助.谢谢. 解决方案 你必须在类定义之外定义你的静态成员并在那里提供初始化器. 第一 // In a header file (if it is in a header file in your case) class A { privat
如何将 std::string 转换为 char* 或 const char*? 解决方案 如果你只是想传递一个 std::string 到需要 const char* 的函数,你可以使用 std::string str; const char * c = str.c_str(); 如果你想获得一个可写的副本,比如 char *,你可以这样做: std::string str; char * writable = new char[str.size() + 1]; std::copy(str.begin(), str.end(), writable); writable[str.size()] = '\0'; // don't forget the terminating 0 // don't forget to free the string after finished using it delete[] writable; 编辑:请注意,上述内容并非异常安全.
我最近遇到了 javascript 中的 const 关键字.据我所知,它用于创建 不可变变量,并且我已经过测试以确保它不能被重新定义(在 node.js 中): const x = 'const'; const x = 'not-const'; // Will give an error: 'constant 'x' has already been defined' 我意识到它尚未在所有浏览器中标准化 - 但我只对 node.js/v8 的上下文感兴趣,并且我注意到某些 开发者/项目似乎非常喜欢它,因为 var 关键字可以用于相同的效果. 问题? 什么时候适合使用 const 代替 var? 是否应该在每次声明不会重新分配的变量时使用它? 如果使用 var 代替 const 或反之亦然,它实际上有什么不同吗? 解决方案 您的问题有两个方面:使用 const 代替 var 的技术方面是什么,以及与人相关的方面是什么所以. 技术差异很大.在编
我很想知道在 JavaScript 中使用 const 设置的值类型是否有任何限制——尤其是函数.这是有效的吗?当然,它确实有效,但出于任何原因,它是否被认为是不好的做法? const doSomething = () => { ... } 应该在 ES6 中以这种方式定义所有函数吗?如果是这样的话,这似乎没有流行起来. 感谢您的任何评论! 解决方案 你做的没有问题,但是你要记住函数声明和函数表达式的区别. 一个函数声明,即: function doSomething () {} 完全提升到作用域的顶部(和 let 和 const 一样,它们也是块作用域). 这意味着以下将起作用: doSomething() // works! function doSomething() {} 一个函数表达式,即: [const | let | var] = function () {} (or () => 是创建一个匿名函数(function
我在 A.h 中有以下代码: class A { public: ... private: ... const int X = 1; float Y[X]; ... }; 如果项目中仅包含头文件 A.h,则编译良好.但是,如果我在 A.cpp 中包含 A.h,它会给我如下奇怪的错误: ... 警告:非静态数据成员初始化器仅适用于-std=c++11 或 -std=gnu++11 [默认启用] ...错误:非静态数据成员'A::X'的使用无效 ...错误:来自这个位置 即使我更改 const int X = 1;(尽管我需要它作为常量参数),也没有任何变化. 附言如果有意义的话,我正在使用 Qt 5.1 附言实际上使它 static 修复了错误.但是为什么我必须这样做呢? 解决方案 你的意图是在类中有一个 constant 变量. 现在这个类用于创建许多对象.实际上,该类应该允许每个对象对 co
我正在编写一个委托类,但它无法采用 const 成员函数.这是一个测试用例: class foo { public: void MemberFunction() { printf("non const member function\n"); } void ConstMemberFunction() const { printf("const member function\n"); } }; template void Call(C* instance) { (instance->*Function)(); } int main (int argc, char** argv) { foo bar; Call(&bar); C
void DoWork(int n); void DoWork(const int &n); 有什么区别 解决方案 当你传递一个大的结构/类时,差异会更加突出. struct MyData { int a,b,c,d,e,f,g,h; long array[1234]; }; void DoWork(MyData md); void DoWork(const MyData& md); 当您使用“普通"参数时,您按值传递参数,从而创建您传递的参数的副本.如果您使用的是 const 引用,则通过引用传递它,并且不会复制原始数据. 在这两种情况下,都不能从函数内部修改原始数据. 编辑: 在某些情况下,原始数据可能会被修改,正如 Charles Bailey 在他的 答案.
GCC 告诉我以下内容:Transformations.h:16:1: error: initializer element is not constant 代码如下: const int X_ORIGIN = 1233086; const int Y_ORIGIN = -4728071; const int Z_ORIGIN = 4085704; const int xyzOrigin[NUM_DIMENSIONS] = {X_ORIGIN, Y_ORIGIN, Z_ORIGIN}; 解决方案 你不能在 C 中的全局范围内这样做,只能在本地范围内,即在函数内: #define NUM_DIMENSIONS 3 const int X_ORIGIN = 1233086; const int Y_ORIGIN = -4728071; const int Z_ORIG
#include #include const int N = 5; int main() { int vett[N] = {1, 2, 3, 4, 5}; return 0; } 代码的这部分问题是什么?编译器向我报告这些错误和警告: error: variable-sized object may not be initialized warning: excess elements in array initializer [enabled by default] warning: (near initialization for 'vett') [enabled by default] 我知道我可以使用define指令来解决,但我曾经在c ++中编程,我不想使用const更改旧习惯.有什么可以做的?谢谢. 与c ++不同,即使使用const int N = 5,N也不被认为是c中的常数表达式.因此int