首页 > 编程语言 >c++小知识(2)

c++小知识(2)

时间:2024-03-08 17:13:36浏览次数:26  
标签:const 函数 对象 知识 c++ 传递 引用 指针

  • 一、引用和指针的区别:

  指针:从本质上讲就是存放变量地址的一个变量,在逻辑上是独立的,它可以被改变,包括其所指向的地址的改变和其指向的地址中所存放的数据的改变。

  引用:是一个别名,它在逻辑上不是独立的,它的存在具有依附性,所以引用必须在一开始就被初始化,而且其引用的对象在其整个生命周期中是不能被改变的(自始至终只能依附于同一个变量)。

指针与引用看上去完全不同(指针用操作符’*’和’->’,引用使用操作符’.’),但是它们似乎有相同的功能。指针与引用都是让你间接引用其他对象。你如何决定在什么时候使用指针,在什么时候使用引用呢?

首先,要认识到在任何情况下都不能用指向空值的引用。一个引用必须总是指向 某些对象。因此如果你使用一个变量并让它指向一个对象,但是该变量在某些时候也可能不指向任何对象,这时你应该把变量声明为指针,因为这样你可以赋空值给 该变量。相反,如果变量肯定指向一个对象,例如你的设计不允许变量为空,这时你就可以把变量声明为引用。

 不存在指向空值的引用这个事实意味着使用引用的代码效率比使用指针的要高。因为在使用引用之前不需要测试它的合法性。

 指针与引用的另一个重要的不同是指针可以被重新赋值以指向另一个不同的对象。但是引用则总是指向在初始化时被指定的对象,以后不能改变。

 

 

 如果操作符[]返回一个指针,那么后一个语句就得这样写:

但是这样会使得v看上去象是一个向量指针。因此你会选择让操作符返回一个引用。(这有一个有趣的例外,参见条款30)当你知道你必须指向一个对象并且不想改变其指向时,或者在重载操作符并为防止不必要的语义误解时,你不应该使用指针。而在除此之外的其他情况下,则应使用指针。

  • 二、c++ const引用详解

(1)在实际的程序中,引用主要被用做函数的形式参数--通常将类对象传递给一个函数.引用必须初始化. 但是用对象的地址初始化引用是错误的,我们可以定义一个指针引用。

 

 

(2)一旦引用已经定义,它就不能再指向其他的对象.这就是为什么它要被初始化的原因。 

(3) const引用可以用不同类型的对象初始化(只要能从一种类型转换到另一种类型即可),也可以是不可寻址的值,如文字常量。例如:

 上面,同样的初始化对于非const引用是不合法的,将导致编译错误。原因有些微妙,需要适当做些解释。

引用在内部存放的是一个对象的地址,它是该对象的别名。对于不可寻址的值,如文字常量,以及不同类型的对象,编译器为了实现引用,必须生成一个临时对象,引用实际上指向该对象,但用户不能访问。

例如:

 编译器将其转换为:

 同理:上面代码

 (4)不允许非const引用指向需要临时对象的对象或值,即,编译器产生临时变量的时候引用必须为const!!!!切记!!

 (5)********对于const int *const & pi_ref = &iva; 具体的分析如下:*********

1.不允许非const引用指向需要临时对象的对象或值

 2.地址值是不可寻址的值

 3.于是,用const对象的地址来初始化一个指向指针的引用

 

const引用的语义到底是什么?最后,我们可能仍然不明白const引用的这个const的语义是什么

const引用表示,试图通过此引用去(间接)改变其引用的对象的值时,编译器会报错! 

这并意味着,此引用所引用的对象也因此变成const类型了。我们仍然可以改变其指向对象的值,只是不通过引用 下面是一个简单的例子:

其中第10行,如果我们通过ir来改变val的值,编译时会出错。但是我们仍然可以通过val直接改变其值(第9行) 

总结:const引用只是表明,保证不会通过此引用间接的改变被引用的对象!

 另外,const既可以放到类型前又可以放到类型后面,放类型后比较容易理解:

 三、值传递、地址传递、指针传递的区别

 

1、值传递:

值传递是最常见的参数传递方式。当我们将一个值传递给函数时,函数会创建该值的副本,并在函数内部使用这个副本。这意味着函数对该值的修改不会影响到原始值。

 

优点:

 

简单直观,易于理解和使用。
函数内部对参数的修改不会影响到原始值,确保了数据的安全性。
缺点:

 

需要额外的内存来存储参数的副本,可能会导致内存消耗过大。
对于大型对象的传递,值传递会导致性能下降。
适用场景:

 

对于简单的数据类型,如整数、字符等,值传递是最合适的选择。
当函数不需要修改原始值,只是使用该值时,值传递也是一个不错的选择。
值传递例子:

在这个例子中,我们将一个整数值传递给changeValue函数。在函数内部,我们将参数num的值修改为5。然而,当我们在main函数中打印num的值时,发现它仍然是10。这是因为在值传递中,函数会创建参数的副本,而不是直接修改原始值。

 2、指针传递

指针传递是通过将参数的内存地址传递给函数来实现的。函数可以通过指针来直接访问和修改原始值。

 

优点:

 

可以直接修改原始值,避免了创建副本的开销。
对于大型对象的传递,指针传递比值传递更高效。
缺点:

 

需要手动管理内存,包括分配和释放内存空间。
指针可能为空或者指向无效的内存地址,需要进行有效性检查。
适用场景:

 

当函数需要修改原始值时,指针传递是一个不错的选择。
对于需要传递大型对象的情况,指针传递可以提高性能。

 

例子2:指针传递

 在这个例子中,我们将指向整数的指针传递给changeValue函数。在函数内部,我们通过解引用指针来修改原始值。当我们在main函数中打印num的值时,发现它已经被修改为5。这是因为指针传递允许函数直接访问和修改原始值。

 

3、引用传递

 

 

引用传递是将参数的引用传递给函数。函数可以通过引用直接访问和修改原始值,而无需创建副本。

 

优点:

 

可以直接修改原始值,避免了创建副本的开销。
使用起来更加简洁,不需要手动管理内存。
缺点:

 

无法传递空值,需要保证引用的有效性。
对于初学者来说,理解引用的概念可能有一定难度。
适用场景:

 

当函数需要修改原始值时,引用传递是最常用的方式。
对于大型对象的传递,引用传递可以提高性能。
例子3:引用传递

 在这个例子中,我们将整数的引用传递给changeValue函数。在函数内部,我们可以直接修改原始值,而无需使用指针或副本。当我们在main函数中打印num的值时,发现它已经被修改为5。这是因为引用传递允许函数直接访问和修改原始值,使得代码更加简洁和易读。

 

标签:const,函数,对象,知识,c++,传递,引用,指针
From: https://www.cnblogs.com/xuweitao/p/18061195

相关文章

  • C++ Qt开发:QFileSystemWatcher文件监视组件
    Qt是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍如何运用QFileSystemWatcher组件实现对文件或目录的监视功能。QFileSystemWatcher是Qt框架中......
  • C/C++结构体最详细的讲解
    转载自知乎:https://zhuanlan.zhihu.com/p/6117720311.定义结构体法一(推荐,写法简单)structStudent{stringm_Name;intm_Age;Student()=default;Student(stringname,intage):m_Name(name),age(m_Age){}};一般定义结构体和类时,如果不写关于构造函数的任何东西,结构......
  • Spring知识回顾
    首先对于我们来说Spring是什么,Spring可以让我们对刚开始写项目时,有一个明确的框架结构,用比较专业的话来讲,就是使用IOC和AOP,即Inversionofcontrol控制反转和AspectOrientedProgramming面向切面编程,总结:Spring就是一个轻量级的控制反转(IOC)和面向切面编程(AOP)的框架。学习IOC的组......
  • c++多线程
    1.线程库的使用创建进程#include<iostream>#include<thread>//线程库头文件usingnamespacestd;voidthread_1(){cout<<"子线程1"<<endl;}intthread_2(intx){cout<<"子线程2"<<endl;returnx;}intm......
  • 网安云知识 | OWASP TOP 10之安全配置错误
    这些漏洞使攻击者能经常访问一些未授权的系统数据或功能。有时,这些漏洞导致系统的完全攻破。业务影响取决于您的应用程序和数据的保护需求。安全配置错误可能发生在应用程序堆栈的任何级别,包括网络服务、平台、Web服务器应用服务器、数据库、框架、自定义代码和预安装的虚拟机、......
  • Java知识拓展
    publicclasstest3{publicstaticvoidmain(String[]args){//进制二进制0b十进制八进制0十六进制0xinti=10;inti2=010;inti3=0x10;System.out.println(i);System.out.println(i2);System.out.println(i3);System.out.println("=======......
  • C++中的static关键字
    在C++中,static是一个关键字,用于声明静态变量、静态函数、静态类成员以及静态局部变量。static关键字的作用取决于它所修饰的上下文,以下是static关键字的几种常见用法:静态变量:在函数内部使用static关键字声明的变量称为静态局部变量。静态局部变量的生命周期延长到整个程......
  • C++中OpenCV、Armadillo矩阵数据格式的转换方式
      本文介绍在C++语言中,矩阵库Armadillo的mat、vec格式数据与计算机视觉库OpenCV的Mat格式数据相互转换的方法。  在C++语言的矩阵库Armadillo与计算机视觉库OpenCV中,都有矩阵格式的数据类型;而这两个库在运行能力方面各有千秋,因此实际应用过程中,难免会遇到需要将二者的矩阵格......
  • C++中的volatile关键字
    在C++中,volatile是一个关键字,用于告诉编译器,该变量的值可能会在未知的时刻被意外地改变,因此编译器对于该修饰的变量的操作时应该保持对该变量内存地址的直接内存访问操作,而不应对访问该变量的代码进行任何优化。。volatile关键字的主要作用是告诉编译器不要对该变量进行优化,......
  • C++ Qt开发:QFileSystemModel文件管理组件
    Qt是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍如何运用QFileSystemModel组件实现文件管理器功能。QFileSystemModel是Qt框架中的一个关键类,用于......