• 2017.2.15


    1.引用用法:

         别名,必须初始化,不允许重定义。

         引用初始化两种=,()

        1.左值引用

           1.做函数参数,改值

           2.引用一个指针,在函数内部可以改变指针的指向,还可以改变指针的值。

    1 int *p1=new int;
    2 int *p2=new int;
    3 int *& p3=p1;  //指针的引用,指向同一块内存
    4 *p3=100;     //改变值
    5 p3=p1;       //改变指向

           3.左值引用是用指针实现的。

           4.引用做返回值,不能返回栈上的数据,可以返回堆,静态区的数据

     1 #include<stdio.h>
     2 #include<iostream>
     3 int * & data()
     4 {
     5     int *p;
     6     p=new int;
     7     *p=10;
     8     int *& rp=p;
     9     return rp;
    10 }
    11 
    12 
    13 int main()
    14 {
    15     int *&rc=data();
    16     std::cout<<*rc<<std::endl;
    17     std::cout<<*rc<<std::endl;
    18     
    19 }
    View Code

           mingw下g++编辑结果为10 10

           ubuntu下g++编译结果为10 0

           vs2015编译结果为 10  257909260

        2.右值引用

            待补

    2.const用法:

           1.c与c++ const对比

              c中的const量,只是一个可读的变量,可以通过强制转换其指针来改变值。

     1 #include<stdio.h>
     2 
     3 int main()
     4 {
     5     const int c=0;
     6     int * p=(int*)(&c);
     7     *p=1;
     8     printf("%d
    ",c);       //用gcc编译c=1,用g++编译c=0
     9 }                              

            c中const量不能用于数组

    1 const int d=82 int len[d];              //c error,c++可以

            c++ const的强制转换方法:

    1 int *p = const_cast<int*>(&a);
    View Code

           c++常量强制转化后修改不变,是因为没从内存读取,而是直接读常量表,但是内存中的值已经修改。

     1 #include<iostream>
     2 
     3 
     4 int main()
     5 {
     6     const int a = 0;
     7     std::cout << &a << std::endl;    //006FFDAC
     8     int *p = const_cast<int*>(&a);
     9     *p = 4;
    10     std::cout << a << std::endl;     // 0
    11     std::cout << *p << std::endl;    // 4  内存已经修改
    12     std::cin.get();
    13 }

           2. 指向常量的指针和常指针

    1 const int *pointer 
    2 int *const pointer   

               c++强类型转换一般约束只会增强,不会削弱。

               比如:

    1 int a=0;
    2 const int b=0;
    3 const int *pointer(&a)   //正确
    4 const int *pointer(&b)   //正确
    5 int *cosnt pointer(&a)   //正确
    6 int *cosnt pointer(&b)   //错误

               3,4两行无论是const还是非const变量的地址,对于指向常量的指针都无关紧要。

               而第6行,把const变量的地址赋给常指针(可以修改值),类型转换某种意义上是削弱了,不能通过const变量的地址来修改值。

    3.new/delete:

               delete不能delete两次(同free)

    1 int *p=new int[10];
    2 
    3 ....
    4 
    5 delete []p;
    View Code

                ::new/::delete 全局

                

       

      

        

  • 相关阅读:
    java-connect-mysql
    搜索框提示列表问题
    方法中的函数会掩盖this,解决办法!
    关于W3C盒子布局
    将类数组转化成数组
    js获取元素宽高
    使用gulp添加版本号
    flex布局
    排序-冒泡排序
    js事件、自定义dom事件、自定义事件
  • 原文地址:https://www.cnblogs.com/acliang/p/6403388.html
Copyright © 2020-2023  润新知