引用、对象实例化

6.引用

引用:引用即别名,是一个已存在的变量(对象)的另外一个名字。

       eg:

        int num = 100;
        int &rn = num; // rn是num的别名,num和rn指代的是同一个对象。
注:1.声明创建引用的时候不占用存储空间
    2.&在此不是求地址运算,而是起标识作用
    3.引用和目标变量的地址是一样的,对引用的修改就是对目标变量的修改。
    4.类型标识符是指目标变量的类型。引用的类型必须和其所绑定的变量的类型相同
    5.引用声明完毕不能再把该引用名作为其他变量名的别名
    6.声明引用时,必须同时对其进行初始化。
    
建立数组的引用:类型 (&引用名)[数组中元素数量]=数组名;
    eg:
    int arr[10]  = {1,2,3,4,5};
    int(&a)[10] = arr;// int(&a)[10]  = arr;
    cout << a[3] << endl;// arr[0] <==> a[0]

 用途:用于在函数参数传递中,解决大块数据或对象的传递效率和空间不如意的问题(避免产生临时对象)。


    eg:void swap(int& a,int& b)
        {
            int t = a;
            a = b;
            b = t;
        }
        int main()
        {
            int a = 2,b = 3;
            cout << a << b << endl;
            swap(a,b);
            cout << a << b << endl;
        }

 常引用:引用时用const修饰,则被说明的引用为常引用.常引用所引用的对象不能被更新


        const <类型说明符> & <引用名>;
        例如:
            const int &n;
        注意:1.如果返回成员对象引用,一般作为常引用返回
                   2.不能返回局部变量的引用
                   3.尽量不要返回函数内部new分配的内存的引用
                   4.可以返回类成员的引用,但最好是const:保障私有数据的安全
            

常数据成员:类中说明了常数据成员,那么构造函数就只能通过初始化列表对该数据成员进行初始化。
    eg:Test():类对象{赋值}
        {
        
        }

6.1对象实例化

在栈中创建对象:
    eg: Test arr[10];
    Test是一个类,创建时调用了10次无参构造函数
在堆中创建对象:
    eg:    类型 *指针名 = new 类型;    //无提供初始默认为0
        类型 *指针名 = new 类型(初值);
        类型 *指针名 = new 类型{初值};
        delete 指针名;
        int *p = new int;
        int *p1 = new int(1024);


        类型 *指针名 = new 类型[元素个数] {初值};
        delete[] 指针名;
        int *p2 = new int[10] {1,2,3,4,5,6,7,8,9,10};
        
临时对象:指在函数传参或者函数返回时,临时创建的没有名字的对象,用完后,会立即销毁.
        eg:不是临时对象             临时对象
            Screen s;            Screen s;
            Color C;            s.setColor(Color{});    
            s.setColor(C);
    

问题:
    1.C语言中的malloc/free和C++中的new/delete有什么区别!!!
    .malloc只分配内存,并不调用对象的构造函数。free也不会调用析构函数
    .new操作符分配内存,调用对象的构造函数(如果需要)。delete操作符在释放内存之前会调用对象的析构函数
    
    .malloc:如果内存分配失败,malloc会返回NULL
    .new:如果内存分配失败,new会抛出一个std::bad_alloc异常,
    
    .C++new和delete是运算符,因此可以像其他运算符一样被重载
    .C语言不支持运算符重载。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值