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++的一个菜鸟,所以很多东西只是很零散。