目录
  • 引用
  • 常引用
  • const关键字用法
    • 1)定义常量
    • 2)定义常量指针
    • 3)定义常引用
  • 总结

    引用

    下面的写法定义了一个引用,并将其初始化为引用某个变量。
    类型名 & 引用名 = 某变量名;

    int n = 4;
    int & r = n; // r 引用了n,r的类型是 int &
    

    某个变量的引用,等价于这个变量,相当于该变量的一个别名。

    int n = 7;
    int & r = n;	// r 引用了n,r和n就是一回事
    r = 4;
    cout << r;		// 输出4
    cout << n;		// 输出4
    n = 5;
    cout << 4;		// 输出5
    

    定义引用时一定要将其初始化成引用某个变量。
    初始化之后,它就一直引用该变量,不会再引用别的变量了。
    引用只能引用变量,不能引用常量和表达式。

    double a = 4, b = 5;
    double & r1 = a;	// r1引用了a
    double & r2 = r1;	// r2也引用了a
    r2 = 10;			// a修改为10
    cout << a << endl;	// 输出10
    r1 = b;				// 用b的值对r1进行赋值,并非r1改为引用b,因为引用是“从一而终”的
    cout << a << endl;	// 输出5
    

    常引用

    定义引用时,前面加const关键字,即为“常引用”。

    int n;
    const int & r = n; // r的类型是const int &
    

    不能通过常引用去修改其引用的内容:
    并不是说引用的内容不能被修改

    int n = 100;
    const int & r = n;
    r = 200; // 编译错误
    n = 300; // ok
    

    常引用和非常引用的转换
    const T &和T &是不同的类型。
    T &类型的引用或T类型的变量可以用来初始化const T &类型的引用。
    const T类型的常变量和const T &类型的引用则不能用来初始化T &类型的引用,除非进行强制类型转换。

    const关键字用法

    1)定义常量

    const int MAX_VAL = 23;
    const double PI = 3.14;
    const string NAME = "Tommy";
    

    2)定义常量指针

    不能通过常量指针修改其指向的内容,但内容本身可以被修改,且常量指针的指向可以变化。

    int n, m;
    const int *p = &n;
    *p = 5;	// 编译错误
    n = 4;	// ok
    p = &m;	// ok,常量指针的指向可以变化
    

    不能把常量指针赋值给非常量指针,反过来可以。

    const int *p1;
    int *p2;
    p1 = p2;		// ok
    p2 = p1;		// error
    p2 = (int*)p1;	// ok,强制类型转换
    

    [注] 因为常量指针对其所指向的内容没有修改权限,自然也不能赋予别的指针这样的权限。否则,非常量指针接收常量指针的赋值之后,便可以修改所指向的内容了,这存在一定安全隐患。

    函数参数为常量指针时,可避免函数内部不小心改变参数指针所指地方的内容。

    void MyPrintf(const char *p)
    {
    	strcpy(p, "this"); 	// 编译出错
    	printf("%s", p);	// ok
    }
    

    3)定义常引用

    不能通过常引用修改其引用的变量

    int n;
    const int & r = n;
    r = 5; // error
    n = 4; // ok
    

    总结

    声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。