C++学习-2

副本机制

lambda不能取地址,无法当作函数指针

[1](2){3}(4)匿名lambda

1捕获列表   =只读    2后加mutable就可以修改副本

                                                     &读写              全部改变                                                  

对部分进行操作是,直接在[]放变量,用&代表读写,只写变量名只可读

=只能用于全部

想不只是改变副本,就加&,进行完全修改

const在C中是伪常量,防止直接,但是间接可以修改,通过地址改变

const在C++编译器自动优化替换,除了被赋予变量,编译器就不敢瞎修改变量的

const数组没有优化可以间接修改

指向常量的指针不能被修改,转一下(int*)

变量const 编译器无法优化

常量const  直接被优化,读取的时候直接在寄存器里面读,so常量的是不会改变的

在指针引用时   在2013 要括号    int(**(&po))=ptr  &和*都要()

左值引用只能搞对象

右值引用可以直接是常量  右值引用为了快速备份寄存器在内存中备份,而且在不需要时,被自动释放

左值引用完全为变量的别名

右值引用完全代替常量的别名

函数返回值有副本机制,返回变量

栈区,自动回收,释放,返回值为指针,不能指向栈区,返回引用,不可引用栈区

指针在栈区,指针指向内存在其他区域

只要使用引用,直接把变量名pb改成(&pb)就可以了

引用数组是非法的...

对引用来说必须是对齐的,不存在大到小的转换

数组名右边是大小,左边是类型

#include<iostream>

using namespace std;

void main()

{

         int i = 10;

         int *p = &i;

         int **pp = &p;

         int**&ppp = pp;

         int a[4]{1, 2, 3, 4};

         int *p[4]{a, a + 1, a + 2, a + 3};

         //int(*p1)[4](new int*[4]);

         int*p1=new int[4]{1, 2, 3, 4};

         cout << p1 << endl;

         int(*p)[2] = (new int[3][2]{{ 1, 2 }, { 3, 4 }, { 5, 6 }});

         int(*&rp)[2] = p;

         for (int m = 0; m < 3;m++)

         {

                  for (int n = 0; n < 2; n++)

                          cout << rp[n][m];

                  cout << endl;

         }

         int(*p)[4] {new int[3][4]{{ 1, 2, 3, 4 }, { 5, 6, 7, 8 }, { 9, 10, 11, 12 }}};

         int *p2(new int(5));

         const int * s = p2;

         const int a[3]{1, 2, 3};

原文地址:https://www.cnblogs.com/tony-xu999/p/8573951.html