首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么不能将nullables声明为const?

在C++中,const关键字用于声明一个常量,即其值在初始化后无法更改。而nullable类型是一种可以为空的类型,它可以包含一个值或者是空值。

nullables声明为const可能会导致混淆和错误,因为const对象在创建后就不能被修改。如果一个对象是nullable的,那么它可能需要在其生命周期中改变其值。因此,将nullables声明为const会破坏其可变性,从而导致程序错误。

例如,假设我们有一个可空的整数类型nullable<int>,并将其声明为const

代码语言:cpp
复制
const nullable<int> x = 42;

在这种情况下,我们不能将x的值更改为其他值,因为它是const的。这可能会导致问题,因为在某些情况下,我们需要改变nullable的值。例如,我们可能需要将其值更改为空或者更改为另一个值。

因此,将nullables声明为const是不推荐的,因为它可能会导致程序错误和混淆。相反,我们应该声明一个非constnullable对象,以便在其生命周期中更改其值。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

【C++】const对象和const成员

如果我们在定义一个对象之后,希望在后面对这个对象进行修改,那么我们可以把这个对象声明为const对象。 声明为const对象之后,这个对象的所有数据成员后面都不能被修改!...const对象 定义类对象时可以将其指定为const对象。定义后const对象不能再被修改。 const对象不能调用非const类型的成员函数。...: “int CTime::getHour(void)”: 不能将“this”指针从“const CTime”转换为“CTime &” e:\chenhaoxiang\20170603\test2\test2...\mian.cpp 34 1 test2 其实就是告诉我们const对象不能引用非const成员函数 为什么要有这个规则: 因为在非const成员函数内部可能对对象进行修改,比如set...3.const成员函数 const成员函数只能被const对象引用。const成员函数内可以引用const数据成员,也可以引用非const数据成员,但不能修改非const数据成员的值。

1.1K10
  • 从零开始学C++之虚函数与多态(二):纯虚函数、抽象类、虚析构函数

    对于暂时无法实现的函数,可以声明为纯虚函数,留给派生类去实现。 注意 抽象类只能作为基类来使用。 不能声明抽象类的对象。...." << endl;     } }; void DrawAllShapes(const vector &v) {     vector::const_iterator...{     vector::const_iterator it;     for (it = v.begin(); it !...#include  using namespace std; // 对于一个没有任何接口的类,如果想要将它定义成抽象类,只能将虚析构函数声明为纯虚的 // 通常情况下在基类中纯虚函数不需要实现...main(void) {     //  Base b; //error, 抽象类     Derived d;     return 0; } // 对于一个没有任何接口的类,如果想要将它定义成抽象类,只能将虚析构函数声明为纯虚的

    1.4K00

    Dart 点将台 | const 关键字知多少

    1.对 const 的认知 80% 的人对 const 的认知,只停留在 const 修饰的量不可以被修改,这一条。 甚至有些人对什么时候可以用 const 修饰还比较模糊。...复制代码 既然提示说,想要 const 修饰对象,其对应构造需要为 const,那就在构造前加个 const 呗。这时你会发现上面的声明飘红了,但下面的 const 修饰的构造方法飘红了。...4.const 的价值 如下:a ,b 对象声明为 const,c 对象使用普通构造,可见 a 和 b 是全等的,由于没有在 Person 类中重写 == 运算符,则说明这两个量在 运行时 是同一块内存地址...同理这里 Text 也无法使用 const 修饰,所以,只能将 const 给 EdgeInsets.all(8.0) 修饰。也就是说,能用 const 修饰的尽量用 const 修饰。...复制代码 7. debug 模式下的 Dart 常量去重策略 昨天有人在群里问了 const 为什么在运行时不相等: 因为 debug 模式 下的 Dart 常量去重策略导致的。

    62420

    python3学习(1)

    -1', 'confidence': 0.73, 'language': ''} python2 和python3文件处理字符编码区别 py2: 1 文件要存为utf-8 2 文件第一行声明为...1 保存为ANSI 2 文件头声明为#encoding=gbk 3 中文前面不加u,加了应该也没事 py3示例: #coding=gbk s = "中国" print(s) #按照gbk转换到unicode...utf-8 s = "中国" print(s) 文件保存为utf-8,#coding=utf-8这个可写可不写,默认是按照utf是转换到unicode的 示例: py2:存为utf-8,文件第一行也声明为...decode("utf-8") str1.decode("utf-8")==u"我们" str1.decode("utf-8").encode("utf-8")==str1 py2:存为ansi,文件第一行也声明为...在内存中是bytes类型保存; 2、s.encode("gbk").decode("gbk") 是把上一步得到的结果解码成gbk编码,在内存中用unicod保存,才可以在终端中展示; 只有在unicode下才能将

    58110

    C++随记(五)---const 与 指针

    ③将 常规变量的地址赋值给常规指针,这个就是我们常见的操作,讨论了;     ④将 const变量的地址 赋值给 常规变量指针,不合法!!!    ...例如: const int day= 3; int * pt3 = & day; //不合法         为什么不合法?...将指针参数声明为指向常量数据的指针有两条理由: · 这样可以避免由于无意间修改该数据而导致的编程错误; · 使用const使得函数能够处理const和非const实参,就如我上述①②,否则只能接受非...不管大陆和中国台湾各自玩的多high,就是不许你中国台湾去代表中国搞事情,就是这个意思吧~         好了说了这么多,来看第二类情况了 2、指针本身声明为常量        来看两个语句...这里的意思是,声明了一个 指向int 类型的 const 指针 pt2,pt2现在自己都不能修改自己的值了,因为 指针本身被声明为了常量。

    57400

    const特性总结(不断更新)

    ii、不能将const对象的地址赋给指向const对象的指针。反之可以,下面在谈。     记住这句话,具有限制的东西永远有最高的权限。...和const iterator    const_iterator----相当于指向const对象的指针(其解引用的值不能改变)    const iterator----相当于const指针 6、 const...;   const A& e = f; // 这样作e只能访问声明为const的函数,而不能访问一般的成员函数; [思考1]: 以下的这种赋值方法正确吗?   ...一般情况下,函数的返回值为某个对象时,如果将其声明为const时,多用于操作符的重载。通常,建议用const修饰函数的返回值类型为某个对象或对某个对象引用的情          况。...const A& operator=(const A& a); 8、 类成员函数中const的使用   一般放在函数体后,形如:void fun() const;   任何不会修改数据成员的函数都因该声明为

    73080

    认识左值与常引用

    由于引用变量中实际上存放的是被引用对象的地址,所以,左值一定可以建立非常引用,对非左值建立常引用,首先要考虑该表达式结果是否能寻址,其次还要考虑表达式结果的数据类型与引用数据类型是否一致,只有在满足了这两个条件的基础上,才能将表达式结果的地址送入引用变量...在C++语言中,经常把函数的参数声明为引用,这样在发生函数调用时可以减少运行时的开销。但要特别注意的是,将函数的参数声明为一般的引用还是声明为常引用,是有讲究的。...在这种情况下,必须修改函数Max()的定义,也就是把它的参数声明为常引用:int Max(const int& a, const int&b),这样就解决问题了。...可见,将函数的参数声明为常引用,不完全是因为参数的值在函数体内不能修改,还考虑了接受非左值作为函数实参的情况。...int &rc=c;中的const去掉,将发生编译错。

    56920

    C++ 重载运算符 继承 多态 (超详细)

    (3) 友元函数重载+重载输入输出流(用的稀烂用的多比较重要) 在左右操作数类型不同时上述重载方式都不能正常使用,这时候就需要两个操作数,在类外重载,因类外不能直接调用,所以要把该函数声明为类的友元。...Myfloat &temp ) ;//写或写都可以,这种如果按照默认的方式一一对应复制,可以写。...允许将一个声明为指向基类的指针指向其公有派生类对象,但是不能将一个声明为指向派生类对象的指针指向基类对象。...声明为指向基类对象的指针,当其指向公有派生类对象时,只能用它来直接访问派生类中从基类继承来的成员,而不能直接访问公有派生类的定义的成员。...{ void p(){ 函数体}; } class Basic { vitrual void p(){ 函数体}; } class Direved :public Basic //构成虚函数

    1.1K21

    左值、右值与常引用

    对非左值建立常引用,首先要考虑该表达式结果是否能寻址,其次还要考虑表达式结果的数据类型与引用数据类型是否一致,只有在满足了这两个条件的基础上,才能将表达式结果的地址送入引用变量。...在C++语言中,经常把函数的参数声明为引用,这样在发生函数调用时可以减少运行时的开销。但要特别注意的是,将函数的参数声明为一般的引用还是声明为常引用,是有讲究的。...在这种情况下,必须修改函数Max()的定义,也就是把它的参数声明为常引用:int Max(const int& a, const int&b),这样就解决问题了。...可见,将函数的参数声明为常引用,不完全是因为参数的值在函数体内不能修改,还考虑了接受非左值作为函数实参的情况。...int &rc=c;中的const去掉,将发生编译错。

    1.1K10

    C++ 左值、右值与常引用

    对非左值建立常引用,首先要考虑该表达式结果是否能寻址,其次还要考虑表达式结果的数据类型与引用数据类型是否一致,只有在满足了这两个条件的基础上,才能将表达式结果的地址送入引用变量。...在 C++ 中,经常把函数的参数声明为引用,这样在发生函数调用时可以减少运行时的开销。但要特别注意的是,将函数的参数声明为一般的引用还是声明为常引用,是有讲究的。...在这种情况下,必须修改函数Max()的定义,也就是把它的参数声明为常引用:int Max(const int& a, const int&b),这样就解决问题了。...可见,将函数的参数声明为常引用,不完全是因为参数的值在函数体内不能修改,还考虑了接受非左值作为函数实参的情况。...const去掉,将发生编译错。

    48020

    【C++】基础:Effective C++高效编程建议

    将数据成员声明为 private 23. 用非成员非友元函数取代成员函数 24. 当类型转换应该用于所有参数时,声明为非成员函数 25. 考虑支持抛异常的 swap 26....只要可能就用const 将某些东西声明为 const 有助于编译器发现使用错误。...考虑支持抛异常的 swap 如果 std::swap 对于你的类型来说是低效的,请提供一个 swap 成员函数。并确保你的 swap 不会抛出异常。...这样的函数提供基本的,强力的,或者抛出保证。 强力保证经常可以通过 copy-and-swap 被实现,但是强力保证并非对所有函数都可用。...感受 template metaprogramming(模板元编程) template metaprogramming(模板元编程)能将工作从运行时转移到编译时,这样就能够更早察觉错误并提高运行时性能。

    13310

    《Effective C++》读书摘要

    三、const const返回值:避免(a*b)=c的错误; const参数:传递指向常量的引用; const成员函数:允许const属性的重载。 四、对象使用前初始化 构造函数成员初始化列表; ?...七、多态基类声明虚析构函数 ()具有多态性质基类()需要虚析构函数; 八、不让异常逃出析构 异常时终止或者吞下; 将可能抛出异常的代码提供给用户管理; 九、不在构造和析构中调用虚函数 调用后仅仅是自身的虚函数...二十二、成员变量声明为private 两种访问权限:private和others; protected并不比public封装性好。...三十七、绝不定义继承的默认参数值 重载的虚函数的默认参数来自于基类; 将默认参数函数声明为普通成员函数,调用私有的虚函数即可。...四十六、类型转换时为模板定义非成员函数 对于模板化的类要支持双操作运算符重载,首先必须是非成员函数,另外为了能让模板具体化必须将函数定在类体内部,因此只能将之声明为友元类型。

    1.9K60

    从零开始学C++之运算符重载(三):完善String类([]、 +、 += 运算符重载)、>>和

    () const;     char &operator[](unsigned int index);     const char &operator[](unsigned int index) const...;     friend String operator+(const String &s1, const String &s2);     String &operator+=(const String... const版本     return const_cast(static_cast(*this)[index]); } const char &String...需要注意的是,不能将String类的构造函数声明为explicit,否则    String s3 = "xxx"; 编译出错;operator[] 的non const 版本调用了const 版本的实现...,其中使用了static_cast和 const_cast 两种类型转换操作符,可以参考这里;operator+ 调用了operator+= 的实现;只能将流类运算符重载为友元函数,因为第一个参数是流类引用

    95000

    c语言中(int)什么意思_c语言中怎么用int转化char

    如果其用于函数参数时,其传递方向为值传递,即只能将实参的值传递给形参,而不能将形参的值传递给实参。 例如:通过这种方式去进行交换两个数是无法达到目的的。...这里是定义一个整形变量 int &b=a;//声明b是整型变量a的别名 int &c=b;//声明c是整型引用变量b的别名 int &d=a;//声明d是整型变量a的别名 e) 引用初始化后不能再被重新声明为另一变量的别名...C++中增加引用主要是作为函数参数,进行数据传递的功能; 我们知道如果用变量名作为实参,其传递方向是单向的,而用引用作为实参其传递方向是双向的; 也许你会问,在c语言中不是有指针吗,用指针进行参数传递也是双向的吗...d=3.1415926; const int &a=d; 以上等价为: double d=3.1415926; int temp=d; const int &a=temp; 如果在上面不用const...则会发生错误 double d=3.1415926; int &a=d;//未加const,错误 为什么

    4.8K10

    C++为什么有参数依赖查找(ADL)?

    这里引起了我们的兴趣:编译器为什么会找到一个命名空间,什么是 name lookup ?为什么库和复杂项目单独编译的时候都没有问题 ?...对于所有其他名称(变量、命名空间、类等),名称查找只能将多个声明关联到同一个实体,否则它必须产生单一明,以便程序能够编译。...查找会在多个作用域中进行,直到找到至少一个声明为止:文件作用域:在全局(顶层命名空间)中,查找会在名称使用之前的作用域中进行。...当限定名称用作声明时,对跟随该限定名称的同一明中使用的名称进行非限定查找,但不对前置名称进行查找。...为什么C++会有ADL为什么在限定名称查找和非限定名称查找之外,C++还要提供参数依赖查找这样的机制呢?

    9710
    领券