精华内容
下载资源
问答
  • 1.非静态常量不能在类中初始化,只能声明,必须在构造函数的初始化列表里初始化。只有静态整形常量可以在类中直接初始化.(char型相当于整型) 2.如果在构造函数中初始化,会出现错误---常量对象是只读(read only)...
    1.非静态常量是不能在类中初始化,只能声明,必须在构造函数的初始化列表里初始化。只有静态整形常量可以在类中直接初始化.(char型相当于整型)
    2.如果在构造函数中初始化,会出现错误---常量对象是只读(read only)的,不能对其赋值,所以要区分初始化和赋值两个不同的概念
    
    3.以下是一个错误提示:
      static const char cconst4 = 'B';     
    //(5) error C2864: 'MyTest::dconst4' : only static const integral data members can be initialized within a class 
    //static const double dconst4 = 200.00;  
    
    
    4.另外引用whz_zb的文章,http://blog.csdn.net/whz_zb/article/details/6875639
    
    
    展开全文
  • 并且引用不能直接与字面值常量或表达式结果绑定。 其中一种例外情况是:初始化常量引用时,允许用任意表达式作为初始值,只要该表达式的结果能转换成引用的类型即可。允许一个常量引用绑定非常量的对象、字面值,...

        在c++语言中,除两种例外情况,其他引用的类型都要和与之绑定的对象严格匹配,如int型的引用只能绑定int型的对象;并且引用不能直接与字面值常量或表达式结果绑定。

        其中一种例外情况是:初始化常量引用时,允许用任意表达式作为初始值,只要该表达式的结果能转换成引用的类型即可。允许为一个常量引用绑定非常量的对象、字面值,甚至是个一般表达式。例如:


    // 以下例子来自《Primer c++ 第五版》
    int i = 42;
    const int &r1 = i;      // 正确
    const int &r2 = 42;     // 正确
    const int &r3 = r1 * 2; // 正确

        接下来看一个更复杂的例子,并通过这个例子来讲解为什么常量引用是个例外。

    double dval = 3.14;
    // int &a = dval;    // 编译错误,因为普通引用的类型要与对象类型一致
    const int &b = dval; // 编译正确
        c++的自动类型转换机制中,当用一个double去初始化int时,会舍弃掉小数转换为int。在上面的例子中,编译后的代码实际是这样的:

    double dval = 3.14;
    const int temp = dval; // 由double生成了一个临时的整形常量
    const int &b = temp;   // 让b绑定这个临时量
        代码中的改变当然是由编译器完成的。

        在这种情况下,引用绑定的是一个临时量对象而不是dval本身。临时量对象就是:当编译器需要一个空间来暂存表达式的求值结果时,临时创建的一个未命名的对象。

        显然,c++认为,常量引用可以绑定这个临时量,而普通引用就不能绑定这个临时量。

        因为c++认为,使用普通引用绑定一个对象,就是为了能通过引用对这个对象做改变。如果普通引用绑定的是一个临时量而不是对象本身,那么改变的是临时量而不是希望改变的那个对象,这种改变是无意义的。所以规定普通引用不能绑定到临时量上。

        那么为什么常量引用就可以呢,因为常量是不能改变的。也就是说,不能通过常量引用去改变对象,那么绑定的是临时量还是对象都无所谓了,反正都不能做改变也就不存在改变无意义的情况。

        所以常量引用可以绑定临时量,也就可以绑定非常量的对象、字面值,甚至是一般表达式,并且不用必须类型一致。

        这里的逻辑有点绕,可能多花点时间才能理解。其实不理解也无所谓,死记语法也是正常操作。

    展开全文
  • 不能直接赋值,这是一定的,因为...或者初始化为字符串外,一般只能单个元素赋值数组名是一个地址常量,不允许改变,但是数组中的元素是变量,可以改变赋值(数组名这个地址[常量]就是元素[变量]的存放位置)a[]是一...
    不能直接赋值,这是一定的,因为有太多的不确定性,容易发生错误

    赋值可以使用strcpy函数,strncpy函数,或者sprintf函数都行,直接等于是不行的~~~~

    规定不能整体引用,只能单个引用
    赋值除了按字符串输入赋给字符数组,或者初始化为字符串外,一般只能单个元素赋值
    数组名是一个地址常量,不允许改变,但是数组中的元素是变量,可以改变赋值(数组名这个地址[常量]就是元素[变量]的存放位置)
    a[]是一个常量,但是a[0]是一个变量

    展开全文
  • 在Java中String类是不可变的,不可变类是一个不能被修改实例的类,实例创建时所有的信息都被初始化,并且不可被修改,这样的设计有很多优点,从内存,同步,数据结构和安全角度来总结为什么把String类设计成不可变的...

    在Java中String类是不可变的,不可变类是一个不能被修改实例的类,实例创建时所有的信息都被初始化,并且不可被修改,这样的设计有很多优点,从内存,同步,数据结构和安全角度来总结为什么把String类设计成不可变的原因。

    1. 字符串常量池的需要
    字符串常量池是一个特殊的存储区域。当创建字符串时,如果字符串已经存在池中,则将返回现有字符串的引用,而不是创建一个新的对象。

    String str1="abc";
    String str2="abc";
    System.out.println(str1==str2);//返回true;
    

    在这里插入图片描述
    2.缓存HashCode

    String类在被创建的时候,hashcode就被缓存到hash成员变量中,因为String类时不可变的,所以hashcode是不会改变的,这样每次想使用hashcode的时候直接取就行了,不用重新计算,提高了效率。

    并且不可变性可以拿来用作HashMap的key,如果String类是可变的,一旦内容发生改变,HashCode也会改变,当根究这个key从HashMap中取的时候有可能取不到value或者是错的value。

    3.线程安全性得以保证

    字符串被广泛用于许多Java类的参数,比如网络连接打开文件等等,如果字符串不是不可变的,连接或者文件的更改将会导致严重的安全问题。
    不可变性使他们可以自由的共享多线程,这就消除了他们进行同步的要求。

    展开全文
  • c++:常量引用

    2020-11-21 10:03:09
    其一:在初始化常量引用时允许用任意表达式作为初始值,只要改表达式的结果转换成引用的类型即可。尤其,允许一个常量引用绑定非常量的对象,字面值。 int i = 42; const int &r1 = i; const int &r2 ...
  • 引用和指针的区别 ...(3) 引用一旦被初始化为指向一个对象,它就不能被改变另一个对象的引用;而指针在任何时候都可以改变指向另一个对象.给引用赋值并不是改变它和原始对象的绑定关系. ...
  • 创建一个一旦其内容就不能在改变的对象,称其一个不可变对象,而它的类称为不可变类 String不是在原内存地址上修改数据,而是重新指向一个新对象,新地址。 每一次声明一个String都创建一个String对象,那将会造成...
  • (3) 引用一旦被初始化为指向一个对象,它就不能被改变另一个对象的引用;而指针在任何时候都可以改变指向另一个对象.给引用赋值并不是改变它和原始对象的绑定关系。(4) 引用的创建和销毁并不会调用类的拷贝构造...
  • 为什么不能用 int * 初始化 const int * &? 比如: int * p = new int(1); 我想引用它: int * &p1 = p; //正确 我不想改变p指向内容的值: const int *p2 = p; //正确 那把前两个合在一起: const int *&p3 = p;...
  • 为什么加个const就OK了,我个人的理解,就像int &r=3;//编译器是会报错的。因为编译器觉得你可能会修改3这个常量,所以在前面加一个const,变成常引用,常引用不会修改值,所以这样就不会有问题...
  • 小编也是一个初学者,若有写的不对的地方,欢迎各位看官们指教!!! 首先我们来了解一下最最最最...因为常量在定义后就不能再被修改了,所以在定义时就需要初始化 2.常量指针 顾名思义,常量指针即指向常量(这里...
  • 如果传引用比传指针安全,为什么?如果我使用常量指针难道不行吗?(1) 引用在创建的同时必须初始化,即引用到一个有效的对象;而指针在定义的时候不必初始化,可以在定义后面的任何地方重新赋值.(2) 存在NULL...
  • 对于引用类型的局部变量,当被final修饰后,只能指向一个对象,地址不能更改。对于成员变量,要么再类中显式初始化,要么再构造方法初始化。-格式通常被final修饰的常量名,一般所有字母都大写。##权限修饰符##-概述...
  • String不可变体现在哪? 仔细看jdk中是如何写的。...这里扩展一下,final修饰类不能被继承,修饰方法不能被重写,修饰变量即为常量。这其中修饰引用数据类型(如对象或数组时),“不可变”指的是对
  • 1、在Java中,String类是不可变类,一个不可变类是一个简单的类,并且这个的实例也不能被修改, 这个类的实例创建的时候初始化所有的信息,并且这些信息不能够被修改 2、字符串常量池 字符串常量池是方法区中一块...
  • 1、在Java中,String类是不可变类,一个不可变类是一个简单的类,并且这个的实例也不能被修改,这个类的实例创建的时候初始化所有的信息,并且这些信息不能够被修改2、字符串常量池字符串常量池是方法区中一块特殊的...
  • 1、在Java中,String类是不可变类,一个不可变类是一个简单的类,并且这个的实例也不能被修改,这个类的实例创建的时候初始化所有的信息,并且这些信息不能够被修改2、字符串常量池字符串常量池是方法区中一块特殊的...
  • 复习基础知识的时候,看到了readonly这里,被...4.通常是简单类型或由简单类型组成的表达式做初始化语句,也可以是Null引用,但是不能是某个对象的引用,因 对象引用是在运行时决定的; 5.更像“静态值”,因为...
  • String类是不可变类,类的实例创建的时候初始化所有的信息,并且这些信息不能被修改 字符串常量池: 是方法区中一块特殊的存储区域,当创建一个字符串常量的时候,判断该字符串字在符串字符串常量池中是否已经存在...
  • c++——引用的本质

    2020-09-18 16:55:14
    为什么不能发生改变?因为引用的本质是一个指针常量 我们怎么知道或者看到它是指针常量?看不到,内部或者说解析器自动转换的 而指针常量,就是只能改变指向的值,而不能改变指向 (指针常量常量指针可惨考指针...
  • 指针可以初始化为空,但是引用不能初始化为空,且引用必须显示初始化; 指针可以改变指向,而引用一经初始化后就不能改变; 可以有const指针,不能有const引用;(为什么?) 因为引用本来就是不可变得,无需加const...
  • C++引用的本质

    2020-07-15 20:57:49
    3.引用的本质是常量指针,所以引用必须初始化,且初始化不能修改。 //指针的本质是指针常量 //编译器自动转换指针常量 int * const ref = &b //指针常量指向是不可以改的,但是内容是可以修改的 int ref =...
  • C++:引用

    2020-06-30 19:36:58
    引用不为空,不可改变引用的对象,必须在创建时被初始化!。 引用只能指向对象,不能指向常量! int i = 17; int& r = i; // r 是一个初始化为 i 的整型引用 int& r2 = 17; //会报错!!! 为什么说...
  • C++ 之 引用(1)

    2020-07-23 21:29:33
    常量引用: 当程序员意图是让函数直接使用传递给它的信息,但不能修改它,则应使用常量引用引用传递 如果实参与引用参数不匹配,C++将生成临时变量,仅当参数const引用时,C++才允许这样做。 临时变量生成情况...
  • 修饰变量时,该变量为常量,需要进行初始化赋值操作,且只能被赋值一次,不可再改变。 虽然引用变量被final修饰之后,虽然不能再指向其他对象,但是它指向的对象的内容是可变的。stack栈里的引用地址不可变,但heap堆里...
  • 指针和引用的分别

    2014-08-09 22:08:49
    如果传引用比传指针安全,为什么?如果我使用常量指针难道 行吗? (1) 引用在创建的同时必须初始化,即引用到一个有效的对象;而指针在定义的时候不必初 始化,可以在定义后面的任何地方重新赋值. (2) 存在...
  • 一个引用变量一旦指定被引用变量后,是不能作为另一个变量的引用的,这也是为什么人家喜欢将引用与int * const p 等价的原因,即引用和指针常量有相同的性质,所以p不能指向其他对象,而且p必须在定义的时候初始化,...

空空如也

空空如也

1 2 3 4 5 ... 11
收藏数 220
精华内容 88
关键字:

为什么引用不能初始化常量