c++拷贝与引用讲解

2023-11-03

 

目录

拷贝与引用

2 const限定符

3 const与指针


拷贝与引用

1)拷贝:即复制。在初始化变量时,初始值会被拷贝到新建的对象中。对象会开辟一块新的内存空间用来存储该变量。

  int a = 10;
  int b = a;
  std::cout << "a的地址:" << &a << std::endl;  // a的地址:000000E7EBEFFC04
  std::cout << "b的地址:" << &b << std::endl;  // b的地址:000000E7EBEFFC24

解释:以上代码中,a与b的值相等,但是a与b的地址并不相等,原因是执行b=a时,相当于b又开辟了一块新的内存空间来存储a中的值。

2)引用:即变量的别名,程序把变量与初始值直接绑定在一起,而非拷贝。引用时,必须初始化。

  int a = 10;
  int &b = a;
  std::cout << "a的地址:" << &a << std::endl;   // a的地址:0000007A67F0F6E4
  std::cout << "b的地址:" << &b << std::endl;   // b的地址:0000007A67F0F6E4

解释:以上代码中,同样a与b相等,同时a与b的地址也相等,这就免去了重新定义变量时要开辟新的内存空间。一定程度上节省了内存空间。

引用拓展:也可以在定义常量的时候,直接使用引用。

  •  const int &a = 10;
     // 相当于:
     // temp = 10;
     // const int &a = temp;

注意:const 必须要加。

2 const限定符

说明:const可防止程序修改某个变量的值。

 const int a = 10;
  a = 20;

解释:上述代码中,使用const修饰了a,并令a = 10,后面又想要将a修改为20,此时程序就会报错:

 如果,删除const关键字,程序便可顺利运行。这就是const起到了限制a变量在后期的程序中,防止被修改的作用。

如果不够明显,请看下面例子:

void showValue(int& val) {
  val = 10000;
  std::cout << val << std::endl;  // 10000
}

int main() 
{
  int c = 100;
  showValue(c);
  std::cout << c << std::endl;  // 10000
  return 0;
}

 解释:上述代码中,c的初始值是100,执行showValue函数以后,由于形参中没有const关键字,同时val使的是引用(即:val与c绑定在一起,地址相同),导致val修改了c的值为1000,所以最终c打印出来即为10000。

很多时候,我们并不希望调用一个函数以后,修改了我们的事先定义好的变量的值。

如果在形参中加入关键字const:

void showValue(const int& val) {
  val = 10000;
  std::cout << val << std::endl;  // 10000
}

int main() 
{
  int c = 100;
  showValue(c);
  std::cout << c << std::endl;  // 10000
  return 0;
}

解释:由于形参中加入了const,程序就会报错。

程序会提示,val不能被修改,也就是c不能被修改。因为val和c是引用的关系。

3 const与指针

说明:指针指向的地址可以改变,但是不能通过解引用来修改指向的值。

语法:const 数据类型 * 变量名

  • 一般用于修饰函数的形参:表示不希望在函数里通过解引用的方式修改内存地址中的值:void func(const int* no, string* str)

  • const修饰的指针所指向的变量可以改变(之前指向a,修改后指向b)

void func(const int* no) {
  //*no = 12; // 说明1:ERR,不能通过指针(解引用),修改指向的常量
  std::cout << "NO.=" << *no << std::endl;  // NO.=13
}
int main() {
  int a = 3;
  const int* p = &a;
  a = 13;
  std::cout << "a = " << a << " *p = " << *p << std::endl;  // a = 13 *p = 13
  func(&a);
  return 0;
}

 

2)指针常量

说明:可通过解引用修改所指向的值,但指针指向的地址不可改变。

语法:数据类型 * const 变量名

  • 定义的同时必须初始化,否则没有意义

  • 可通过解引用的方式修改内存地址中的值


int a = 3, b = 8;
int* const p = &a;
*p = 13;  // *p = 13
// p = &b //说明1:如果让p重新指向b 会报错 ERR

3)常指针常量

语法:const 数据类型* const 变量名

说明:指向变量的对象不可改变,不能通过解引用的方法来修改内存中的值 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

c++拷贝与引用讲解 的相关文章

随机推荐

  • xmlHttpRequest的status的值的含义

    转自 http www cnblogs com zhubaoxu archive 2008 03 17 1109315 html 虽然常写ajax方面的东西 但是很少去专门了解xmlHttpRequest的status各个值的含义 只是在用
  • C语言基础知识--static 关键字

    目录 一 static 修饰全局变量 二 static 修饰局部变量 三 static 修饰函数 一 static 修饰全局变量 此用法多出现在由多个源文件组成的项目中 static修饰表示该变量只可在定义该变量的文件下访问该static变
  • MinGW安装教程

    前言 本文主要讲述如何安装 C语言 编译器 MinGW 特点是文章附有完整详细的实际安装过程截图 文字反而起说明提示作用 编写本文的原因始于我的一个观点 图片可以比文字传达更多的信息 也能让其他人更容易理解作者的意图及思想 因此 我将安装
  • luckysheet内网(离线)使用

    luckysheet内网 离线 使用 需要先把有关联网引用的文件 搞下来 const dependScripts https cdn jsdelivr net npm vue 2 6 11 expendPlugins chart onlin
  • [Unity 3D] 求两个向量间的夹角的方法

    1 Vector3 d1 transform forward Vector3 d2 new Vector3 0 3 0 float angle Vector3 Angle d1 d2 2 Vector3 d1 transform forwa
  • 微信小程序实现js控制动画——点击播放动画

    功能需求 点击刷新图标 图标旋转进入Loading状态 加载完毕 动画停止 index wxml
  • JAVA中 IO输入输出流的基本用法和文件复制的案例

    IO 即in和out 也就是输入和输出 指应用程序和外部设备之间的数据传递 常见的外部设备包括文件 管道 网络连接 Java 中是通过流处理IO 的 那么什么是流 流 Stream 是一个抽象的概念 是指一连串的数据 字符或字节 是以先进先
  • npm .npmrc作用

    在执行npm install g cordova ionic时出错 可以修改npm源 npm全名Node Package Manager npmrc文件的作用 就是配置npm源 该文件在C盘用户文件目录下 eg 淘宝源 registry h
  • ORCAD 16.6使用说明及技巧

    1 元器件基本操作 R 翻转 H 左右镜像 V 上下镜像 I 放大视图 O 缩小视图 2 选中工程根文件夹 点击Edit Browse Parts Nets等可查看所有信息 3 元件属性 白色 instance 平坦式 黄色 occuren
  • socket原理以及socket的简单实现

    目录 一 socket学前基础 TCP的三次握手和四次挥手 二 为什么要使用socket 三 什么是socket 四 socket的简单代码实现 服务端 客户端 一 socket学前基础 TCP的三次握手和四次挥手 1 服务端和客户端如果想
  • python怎么绘制渐变图_有没有一种使用Python生成渐变位图的简单方法?

    实现这一点的一种方法是使用matplotlib 正如您在标记中建议的那样 为了做到这一点 我会的使用numpy创建一个NxN数组来表示image gradient 在 创建一个figure 其大小以英寸为单位与圆的半径 image circ
  • 浏览器console几种报错类型

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 1 SyntaxError 语法错误 2 TypeError 类型错误 通常是 is not a function 即 不是一个函数 3 ReferenceError 引用
  • 开启电脑虚拟化功能

    一 查看笔记本是否支持虚拟化 打开任务管理器 同时摁住ctrl alt del这个三个健 选择任务管理器 查看是否开启虚拟机 如果未开启 一 进入BIOS 参考以下按键 开机时按住对应的键进入BIOS 组装机以主板分 华硕按F8 Intel
  • 最强自动化测试框架Playwright-(2)元素定位

    元素定位 定位器是playwright自动等待和重试功能的核心部分 简而言之 定位器表示一种随时在页面上查找元素的方法 Locators Playwright Python 如下这些是推荐的 page get by role 按显式和隐式辅
  • 关于window.open()方法 返回的的打开的新窗口的对象

    关于window open 方法 返回的的打开的新窗口的对象
  • Dump libasound 音频数据

    QNX有如下两种方法dump pcm数据 可以录声卡之前的数据 1 QNX自带的pcm logger工具 工具位置 qnx qnx sdp target qnx7 aarch64le usr bin pcm logger 打开pcm dum
  • 计算机网络-运输层

    To 个人主页 关注不迷路 运输层 重要概念 运输层为相互通信的应用进程提供逻辑通信 端口和套接字的意义 无连接的 UDP 的特点 面向连接的 TCP 的特点 在不可靠的网络上实现可靠传输的工作原理 停止等待协议和 ARQ 协议 TCP 滑
  • 蓝桥杯:外卖店优先级(map排序算法) Java

    分析 发现只是输入两种数据 则可以考虑用map 经过分析发现 可以用店家编号来表示map的第一个参数Integer 第二个参数因为有可能有多个相同的时刻 所以用arraylist
  • 一, SpringCloud Alibaba-nacos注册中心

    1 nacos官网 https nacos io zh cn https nacos io zh cn docs what is nacos html https github com alibaba spring cloud alibab
  • c++拷贝与引用讲解

    目录 拷贝与引用 2 const限定符 3 const与指针 拷贝与引用 1 拷贝 即复制 在初始化变量时 初始值会被拷贝到新建的对象中 对象会开辟一块新的内存空间用来存储该变量 int a 10 int b a std cout lt l