C++学习笔记4--左值和右值、const、new和delete

本文详细介绍了C++中的左值与右值的概念及其应用,包括它们的区别与联系、如何使用std.move将左值转化为右值等内容。此外还深入探讨了const关键字的多种用法以及new/delete操作符的基本用法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 左值和右值

C/C++语言中可以放在赋值符号左边的变量,即具有对应的可以由用户访问的存储单元,并且能够由用户去改变其值的量。或者说左值是代表一个内存地址值,并且通过这个内存地址,就可以对内存进行读并且写(主要是能写)操作;这也就是为什么左值可以被赋值的原因了。相对应的还有右值:当一个符号或者常量放在操作符右边的时候,计算机就读取他们的“右值”,也就是其代表的真实值。简单来说就是,左值相当于地址值,右值相当于数据值。

   左值一般在内存有实体,能放在赋值号左边被赋值的值,左值引用取地址和引用的变量地址是同一个地址。左值引用内部实现的是一个指针。

int a = 10;
int &a1 = a;  //左值引用相当于a1是a的别名,地址是一样的。

   右值赋值是存放在右边的值,可能在cpu上,也可能在寄存器当中,右值用于节约内存实现对象拷贝。

int a;
int * &&p = &a;

关于左值右值更具体的介绍,可以参考这篇博客C++11 左值、右值、右值引用详解

一般来说左值是变量,而右值一般是常量或者一些表达式。一般来讲,左值都是有地址的,但是右值一般没有地址。

一般我们是可以使用右值给左值赋值,但是左值一般不能给右值赋值。但是我们可以使用std.move()函数可以把左值变成右值

2. const使用

Const 是C++中常用的类型修饰符,常类型是指使用类型修饰符const说明的类型,常类型的变量或对象的值是不能被更新的。

一般来讲,C语言的const是伪常量类型,但是C++是真正的常变量。一般const 具有以下几种常见的使用方法:

const int a  = 10;  //定义一个常量,他是有地址的
int b = 11;
// a = 11; //非法,常量不可以被赋值的
const int *p1 = &b ; //等价于int const *p = &b,定义一个指向常量的指针变量。
//*p1 = 11  非法,常量不可以被修改
int const *p2 = &b; // 指向变量的常指针
//*p2 = 11;  合法,变量可以被赋值
// p2 = &c ; 非法,常指针的方向是不可以被修改。
const int * const p3 = &b //指向常量的常指针。
将Const类型转化为非Const类型的方法

采用const_cast 进行转换。
用法:const_cast <type_id> (expression)

#include<iostream>
#include<stdlib.h>

int main()
{
    int a(10);  //如果是常量的话,C++是可以直接从内存中获取地址的,
    const int b(11); //如果是常量的话,是从常量表中获取数值,而不是从内存中获取数据的
    std::cout << &a << std::endl;
    int *p = const_cast<int *>(&a);
    *p = 11;
    std::cout << a << std::endl;
    std::cout << *p << std::endl;
    system("pause");
    return 0;
}

关于const的更具体的用法,可以参考这篇博客关于C++ const 的全面总结

3. new和delete

对于计算机程序设计而言,变量和对象在内存中的分配都是编译器在编译程序时安排好的,这带来了极大的不便,如数组必须大开小用,指针必须指向一个已经存在的变量或对象。对于不能确定需要占用多少内存的情况,动态内存分配解决了这个问题。

new是c++新特性,和C语言的malloc类似,创建在堆中,数组创建在栈中
创建一个int 类型的数据,可以使用
int *p = new int, 创建一个数组可以使用
int *p = new int[10] 创建一个10个元素的数组。注意使用 new之后需要使用delete释放内存。使用数组创建的时候,需要使用delete []p, 而且delete仅仅可以删除一次。

   更多的细节可以参考这篇博客浅谈 C++ 中的 new/delete 和 new[]/delete[]

这里写C++学习笔记只是为了防止自己遗忘这个知识点了,以后可以查找方便。自己还是C++的一个菜鸟,所以很多东西只是很零散。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值