C++基础之引用

C++入门基础之引用(&)初学者必看 引用的特性 1.引用在定义的时候,必须要进行初始化操作。这意味着,在创建一个引用时,就需要指定它所关联的实体。2.值得注意的是,一个变量能够拥有多个引用。这表明,多个引用可以同时指向同一个变量。3.同时,引用还具有这样的特性:一旦某个引用关联了一个实体,此后便无法再引用其他实体。也就是说,引用与实体之间的关联关系一旦确立,就不可更改。 引用的一些实例 交换函数 链表 指针变量也可以取别名,这⾥LTNode*& phead就是给指针变量取别名 这样就不需要⽤⼆级指针了,相对⽽⾔简化了程序 阅读详情

目录:

1. 什么是引用?

2. 引用的本质

3. 引用作为函数参数

4. 引用作为函数的返回值
例1

5. 引用总结:(指针和引用的区别)




1. 什么是引用?

在理解引用概念前,先来说变量名。 变量名实质就是一段连续内存空间的别名。那一段连续的内存空间只能取一个别名吗? 显然不是,那就产生引用的概念。

在C++中,引用是一个已定义变量的别名。其语法是:

类型 & 引用名 = 目标变量名;

如:

void test0() {    
	int a = 1;    
	int & ref1 = a;    
	int & ref2; 
}

在使用引用的过程中,要注意以下几点:

  1. &在这里不再是取地址符号,而是引用符号,相当于&有了第二种用法
  2. 引用的类型必须和其绑定的变量的类型相同
  3. 声明引用的同时,必须对引用进行初始化;否则编译时报错
  4. 一旦绑定到某个变量之后,就不会再改变其指向
  5. 引用在定义的时候必须要初始化,必须要绑定到一个实体,本身是不能独立存在的



2. 引用的本质

C++中的引用本质上是一种被限制的指针。类似于线性表和栈的关系,栈是被限制的线性表,底层实现相同,只不过逻辑上的用法不同而已。(引用底层实现是指针,* const ==> 指针常量)

由于引用是被限制的指针,所以引用是占据内存的,占据的大小就是一个指针的大小。有很多的说法,都说引用不会占据存储空间,其只是一个变量的别名,但这种说法并不准确。引用变量会占据存储空间,存放的是一个地址,但是编译器阻止对它本身的任何访问,从一而终总是指向初始的目标单元。在汇编里, 引用的本质就是“间接寻址”。



3. 引用作为函数参数

在没有引用之前,如果我们想通过形参改变实参的值,只有使用指针才能到达目的。但使用指针的过程中,不好操作,很容易犯错。 而引用既然可以作为其他变量的别人而存在,那在很多场合下就可以用引用代替指针,因而也具有更好的可读性和实用性。这就是引用存在的意义。

一个经典的例子就是交换两个变量的值。

//用指针作为参数 
void swap(int * pa, int * pb) 
{    
	int temp = *pa;    
	*pa = *pb;    
	*pb = temp; 
} 

//引用作为参数 
void swap(int & x, int & y)
{
	int temp = x;
	x = y;
	y = temp; 
}

参数传递的方式除了上面的指针传递和引用传递两种外,还有值传递。

采用 值传递 时,系统会在内存中开辟空间用来存储形参变量,并将实参变量的值拷贝给形参变量,即形参变量只是实参变量的副本而已;如果函数传递的是类对象,系统还会调用类中的拷贝构造函数来构造形参对象,假如对象占据的存储空间比较大,那就很不划算了。这种情况下,强烈建议使用引用作为函数的形参,这样会大大提高函数的时空效率。

当用 引用 作为函数的参数时,其效果和用指针作为函数参数的效果相当。当调用函数时,函数中的形参就会被当成实参变量或对象的一个别名来使用,也就是说此时函数中对形参的各种操作实际上是对实参本身进行操作,而非简单的将实参变量或对象的值拷贝给形参。

使用 指针 作为函数的形参虽然达到的效果和使用引用一样,但当调用函数时仍需要为形参指针变量在内存中分配空间,而引用则不需要这样,故在C++中推荐使用引用而非指针作为函数的参数

引用的优势:直观,不需要参数开辟额外空间,不需要进行复制,提高程序执行效率



4. 引用作为函数的返回值

语法:

类型 & 函数名(形参列表) 
{ 函数体 }

当以引用作为函数的返回值时,返回的变量其生命周期一定是要大于函数的生命周期 的,即当函数执行完毕时,返回的变量还存在。

int gNumber; //全局变量

int func1() // 当函数返回时,会对temp进行复制 
{    
	temp = 100;    
	return temp; 
}

int & func2() //当函数返回时,不会对temp进行复制,因为返回的是引用 
{    
	temp = 1000;    
	return temp; 
}

当引用作为函数的返回值时,必须遵守以下规则:

  1. 不能返回局部变量的引用。主要原因是局部变量会在函数返回后被销毁,因此被返回的引用就成为了"无所指"的引用,程序会进入未知状态。(普通函数直接返回引用没有意义)

  2. 不能在函数内部返回new分配的堆空间变量的引用。如果返回的引用只是作为一 个临时变量出现,而没有被赋予一个实际的变量,那么该引用所在的空间就无 法释放,会造成内存泄漏。

int & func3() 
{    
	int number = 1;    
	return number; 
}

int & func4() 
{
	int * pint = new int(1);
	return *pint; 
}

void test() 
{    
	int a = 2, b = 4;    
	int c = a + func4() + b;//内存泄漏 
}

例:

#include <iostream>

using std::endl;
using std::cout;

int val = 10;

int & func()
{
    int val2 = 20;
    //return val2; //error val2的生命周期不大于func的生命周期
    return val;
}

//返回堆空间的引用,可能会造成内存泄漏,
//没有内存回收的机制
int &getHeapData()
{
    int *pInt = new int(10);
    return *pInt; //error
}

int arr[10] = {1, 2, 3, 4, 5};
int &getIndex(int idx)
{
    //暂时不考虑越界问题
    return arr[idx];//没有复制操作
}

//因为对arr[0]的返回值是引用,修改值等于修改arr数组里的值,arr也发生改变
void func2()
{
    cout << "getIndex(0) = " << getIndex(0) << endl;
    getIndex(0) = 10;
    cout << "getIndex(0) = " << getIndex(0) << endl;
    cout << "arr[0] = " << arr[0] << endl;

}

void func3()
{
    int val3 = 3, val4 = 4;
    int val5 = val3 + val4 + getHeapData();//内存泄漏,直接修改了本身
    cout << "val5 = " << val5 << endl;

    //正确接收getHeapData的返回引用值,打印并回收内存
    int & ref = getHeapData();
    cout << "ref = " << ref << endl;
    delete &ref;
}


int main()
{
    func2();
    cout << endl;
    func3();
    return 0;
}



5. 引用总结:

  1. 在引用的使用中,单纯给某个变量取个别名是毫无意义的,引用的目的主要用于在函数参数传递中,解决大块数据或对象的传递效率和空间不如意的问题。
  2. 用引用传递函数的参数,能保证参数传递中不产生副本,提高传递的效率,且通过const的使用,保证了引用传递的安全性。
  3. 引用与指针的区别是,指针通过某个指针变量指向一个变量后,对它所指向的变量间接操作。程序中使用指针,程序的可读性差;而引用本身就是目标变量的别名,对引用的操作就是对目标变量的操作。
JavaScript China城市联动 中国全城市的地址省,市,县 <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title></title> <script src="jquery.js"></script> <script src="json.js"></... 阅读详情

相关推荐

数字IC后端设计实现 | PR工具中到底应该如何控制density和congestion?(ICC2&Innovus)

数字IC后端设计实现中到底应该如何控制cell density和congestion?(ICC2和Innovus两种解决方案)

weixin_37584728的博客 7113

C++基础(5) —— 前向引用声明、UML简介、结构体、联合体、枚举类

一、前向引用声明 类应该先声明,后使用; 如果需要在某个类的声明之前,引用该类,则应进行前向引用声明。 前向引用声明只为程序引入一个标识符,但具体声明在其他地方。 class B; //前向引用声明 class A{ public: void f(B b); }; class B{ public: void g(A a); } 前向引用声明注意事项 ...

weixin_45926367的博客 1591

水下井口装置及钻杆建模

内容:海上油气资源开采的过程中,通常会由海上钻井平台下入钻杆连接到海底井口装置。OrcaFlex软件可进行各种海洋工程结构动态分析,通过各项数据的输入,能够很方便地进行水下井口装置及钻杆建模。直接使用软件New Line及new vessel功能,再设置模型的各项参数(几何属性、弯曲刚度、轴线刚度、扭转刚度、泊松比等)即可建成井口装置及钻杆模型。 设置管线的几何属性:主要包括管线的内外径、壁厚、...

s0302017的博客 1145

[C++]前向引用声明

[C++]前向引用声明

weixin_60479183的博客 1129

android 运动目标检测_MindSpore应用案例:AI对篮球运动员目标的检测

MindSpore作为一个端边云协同的开源的全场景AI框架,今年3月份开源以来,受到了业界的广泛关注和应用,欢迎大家参与开源贡献、模型众智合作、行业创新与应用、学术合作等,贡献您在云侧、端侧 (HiMindSpore 应用程序)、边侧以及安全领域的应用案例。MindSpore与您在AI领域共同成长,让AI使能千行百业,释放出强大的生产力。本文讲述的是MindSpore对篮球运动员目标的检测应用,通...

weixin_33603813的博客 835

AnyLogic 8.8.3 最新版安装指南:从下载到配置的完整流程(附Java环境设置技巧)

本文提供了AnyLogic 8.8.3最新版从下载到配置的完整安装指南,重点解决了跨平台(Windows、macOS、Linux)部署中的常见问题。核心内容详细讲解了Java开发环境(JDK)的精准配置技巧,包括版本选择、系统环境变量设置与验证,确保为仿真建模工作奠定稳固基础。

efc1234567的博客 762

【C++】前向引用申明

C++中类应当先定义然后才能够使用,但是有时候,两个类存在相互引用的情况,这样无论把哪个类放在前面都不行,这种便叫做循环依赖。 例如 class A { public: void f(B b); }; class B { public: void g(A a); }; 这里类A的公有成员函数f的形式参数是类B的对象,同时类B的公有成员函数g也以类A的对象为形参。在使用一个类之前,必须首先

POE_Trinity的专栏 1250

开源libmodbus编译为32位和64位动态库

libmodbus 是支持Linux,Mac OS X,window 的一个开源库,支持modbus TCP和RTU 两种模式。

lemontree1945的博客 1923

C++之类的组合(聚合)

在我们对现实中的某些事物抽象成类时,可能会形成很复杂的类,为了更简洁的进行软件开发,我们经常把其中相对比较独立的部分拿出来定义成一个个简单的类,这些比较简单的类又可以分出更简单的类,最后由这些简单的类再组成我们想要的类。比如,我们想要创建一个计算机系统的类,首先计算机由硬件和软件组成,硬件又分为CPU、存储器等,软件分为系统软件和应用软件,如果我们直接创建这个类是不是很复杂?这时候我们就可以将CP

小凡的专栏 1万+

3、深入了解响应式扩展(Reactive Extensions)

本文深入探讨了响应式扩展(Reactive Extensions,Rx)的起源、核心概念及其在客户端和服务器端的应用。从Volta项目谈起,解析了Rx如何解决事件传输问题,并介绍了可观察对象(IObservable)和观察者(IObserver)的设计与实现机制。文章还详细讲解了Rx操作符、弹珠图的使用、拉模型与推模型的对偶性原理,并通过代码示例展示了如何将枚举转换为可观察对象。最后总结了Rx的优势,并展望其在未来软件开发中的广泛应用前景。

m2n3b4v5c6的博客 113

【Claude】Auto Mode 触发安全分类器拦截的三种错误变体及对应处理 bug报错已解决

深度解析Claude Auto Mode安全分类器拦截的三种变体:内容拒绝、操作中断、累积触发,含完整排查流程与绕过策略。

博客 7595

C++向前引用

class QCheckBox; 这句是告诉编译器QCheckBox是一个类,但是个什么类还不知道,所以如果只有前置声明,而没有把类的定义包含进来之前,声明的class只能作为定义指针使用,无法定义对象也不能调用里面的成员。如果要定义对象或调用里面的成员,类的定义需你自己包含进来,编译器不会帮你搜索的。

zaza81的专栏 677

083、多帧降噪(MFR)与VST算法:低照度场景下的信噪比提升与鬼影抑制

本文深入探讨了多帧降噪(MFR)和VST算法在低照度场景中的应用与优化。作者从实际项目案例出发,指出单帧降噪的局限性,详细分析了MFR的核心原理与工程实现中的关键环节,包括帧对齐、帧选择、融合策略和鬼影抑制等技术要点。文章特别强调VST变换对噪声均匀化的重要性,并分享了实际开发中的调试经验与参数优化技巧,如"三明治"调试法和性能平衡策略。最后指出,优秀的MFR方案需要在信噪比提升、鬼影抑制和纹理保留之间找到场景化的平衡点,建议开发者通过真实场景测试验证算法效果。全文既有理论分析,又包含丰富的实战经验和技术细

zzfmlxs的博客 123

C++引用传递基础

C++引用传递基础 引用变量:相当于是给变量内存块(内存单元)起别名 例如: 这里,我们存放整形变量10的内存单元名字为a,我们用过int &b = a; 让这个叫a的内存块有另外一个名字为b,从这里开始,a和b都指的是这个存放整形变量10的内存单元。 引用变量主要应用在函数的形参上,通过引用变量的使用,传递给函数的参数,就不是实参的副本了,可以直接通过修改形参,修...

IT_Quanwudi的博客 1万+

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

【C++从入门到入门】C++基础:.cpp 基本结构,基本数据类型,引用,指针,函数

c++基础:.cpp 基本结构,基本数据类型,引用,指针,函数

android_zyf的博客 1153

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

【C++掌中宝】走进C++引用的世界:从基础到应用

C++引用相关知识分享

2301_80191662的博客 2052

C++ 基础之引用

y_q_m的博客 148

C++学习:六个月从基础到就业——C++基础语法回顾:指针与引用基础

指针是一种存储内存地址的变量。通过指针,我们可以间接访问存储在该地址的数据。// unique_ptr:独占所有权// C++14// 离开作用域时自动释放// shared_ptr:共享所有权// 两个指针共享同一对象// 当最后一个shared_ptr销毁时释放对象引用是一个变量的别名,必须初始化,并且初始化后不能改变引用的对象。指针和引用是C++中最强大且最具挑战性的特性。指针提供了对内存的直接访问和操作能力,但也带来了内存泄漏、段错误等风险。

qq_53773901的博客 1587

CPP-基础:关于引用

1.什么是“引用”?申明和使用“引用”要注意哪些问题?   引用就是某个目标变量的“别名”(alias),对应用的操作与对变量直接操作效果完全相同。   申明一个引用的时候,切记要对其进行初始化。   引用声明完毕后,不能再把该引用名作为其他变量名的别名。   声明一个引用,不是新定义了一个变量,它本身不是一种数据类型,因此引用本身不占存储单元,系统也不给引用分配存储单元。  ...

dixiongbi7761的博客 222

c++基础、引用、指针。

c++入门,基本概念解释。

qq_42392701的博客 120

C++基础之引用与typedef

C++基础之引用与typedef 引用 1. 初识引用 引用就是对象的另一个名字。在实际程序中,引用主要用作函数的形式参数。我们将在后面再详细介绍引用参数。 引用是一种复合类型,通过在变量名前添加“&amp;”符号来定义。复合类型是指用其他类型定义的类型。在引用的情况下,每一种引用类型都“关联到”某一其他类型。不能定义引用类型的引用,但可以定义任何其他类型的引用。 引用必须用与该引用...

樊兴旺 2073

C++入门基础之引用(复习)

Hello!!大家早上中午晚上好,今天我们来复习C++入门基础篇之引用!!!例: 2、引用必须初始化!不初始化会报错; 例: 运行:可以这么理解,pa就是a,pa只能是a,a改变影响pa,pa改变影响a; 编译报错: 对于const 常变量必须要用const 引用不然编译会报错因为这里涉及的是权限的放大,权限可以缩小但不能放大例: 这里从int到const int是权限的缩小,所以没问题;例: 对于以上情况如果用test1传值传参每次调用test1都会生成一份a的临时拷贝,调用10

2401_83238095的博客 355

c++引用基础

与int c = a不同的是,这个方法会单独开辟一个新的内存空间,用于存储c的数据,但是引用方法不会。因此,对引用方法创建的新变量名b进行修改数据(类似 *b = 20),会使得a 的数据也进行更改。引用,简单来说就是起个别名,通过不同的变量名指向同一个内存,读取同一个数据。本质上来说,是个指针常量(类似int* const b = &a)。以指针(地址)为形参传递时,可以对实参进行修改,因此下述代码可以将a和b的值进行交换。或者更直观的感受,直接输出&a,&b,会发现两者的地址完全一样。

uishd666的博客 143

【C++基础入门】命名空间 ;.c/.cpp输入输出流;缺省参数;函数重载;引用;auto;范围for

【C++基础入门】命名空间 ;.c/.cpp输入输出流;缺省参数;函数重载;引用;auto;范围for

Catherine_77的博客 638

《C++初阶之入门基础》【普通引用 + 常量引用 + 内联函数 + nullptr】

本文详细解析了C++中的引用机制,重点介绍了普通引用的概念、特性及三大核心应用场景。文章通过代码示例展示了引用作为变量别名、函数参数和函数返回值的具体用法,并对比了引用与指针作为函数参数的异同。此外,还简要提及了内联函数和nullptr的使用场景。全文旨在帮助读者深入理解C++引用的工作原理和实际应用价值。

序属秋秋秋的博客 2434

对于C++入门基础:函数重载、引用、const引用、inline、nullptr的解析

本文深入解析了C++中的几个关键特性:函数重载、引用、const、inline和nullptr。函数重载允许同名函数通过参数差异实现多态;引用作为变量的别名,与指针相辅相成但更安全;const引用能够绑定常量并优化性能;inline内联函数取代宏函数,提高效率;nullptr专门解决指针重载问题。这些基础特性共同构成了C++高效、安全的核心机制,理解它们对于掌握C++编程至关重要。从函数重载的灵活性到引用的安全性,每个特性都体现了C++设计者的深思熟虑,是进阶学习类和对象等高级特性的基础。

2503_92929084的博客 1881
上一篇: C++基础之 new/delete 概述
下一篇: C++基础之强制转换
Yol_2626
博客等级 码龄7年 28粉丝 32原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值