[温故而知新] 关于C++的引用

温故而知新-C++程序员的不平凡挑战 平凡类型指的是那些大小和结构固定的数据类型,它们的构造函数、析构函数、拷贝构造函数和赋值运算符都是默认生成的,不进行任何操作。常见的平凡类型包括基本类型(如int、float、double等)、指针类型、引用类型、联合类型以及空类(没有数据成员的类)。使用平凡类型很简单,它们的效率高,易于使用,但功能有限,灵活性差。 阅读详情

好久没写博,平时都是把笔记写在有道云笔记里,最近国庆,克服懒癌来写写。距离上次写博,都快半年了,以后要勤快点了。话说霹雳布袋戏又要出新剧集了。

这里写图片描述

进入正题,写这篇文章的原因

之前看过几本C++的书,只记得C++的引用只是个所谓的“别名”,但是总感觉这东西很奇怪,当时也没具体去深究它,最近在看一本金山的一个哥们写的《深入应用C++ 11》,里面在聊到右值引用的时候,对引用有一句描述:

无论声明左值引用还是右值引用都必须立即进行初始化,因为引用类型本身并不拥有所绑定对象的内存,只是该对象的别名。

这里暂不深入讨论C++的左值引用和右值引用。
书中的这句话又让我想起之前的疑问,什么叫“不拥有所绑定对象的内存”?是说引用不占用内存??比如下面的代码:

#include <stdio.h>
class A{
public:
        int i;
        int j;
};

int main(){
        A * p = new A;
        A& q = *p;
        printf("%p %p \n",p,&q);

        return 0;
}

上面的代码编译后执行,输出结果为:
0x7f98d0404aa0 0x7f98d0404aa0
也就是看起来好像p和q是同一个东西,但是…

这里的q 是一个引用,那到底q占不占内存呢?看看汇编代码就知道了:

Disassembly of section .text:

0000000100000f20 <_main>:
   100000f20:   55                      push   %rbp
   100000f21:   48 89 e5                mov    %rsp,%rbp
   100000f24:   48 83 ec 20             sub    $0x20,%rsp
   100000f28:   b8 08 00 00 00          mov    $0x8,%eax
   100000f2d:   89 c7                   mov    %eax,%edi
   100000f2f:   c7 45 fc 00 00 00 00    movl   $0x0,-0x4(%rbp)
   100000f36:   e8 2f 00 00 00          callq  100000f6a <_main+0x4a>
   100000f3b:   48 8d 3d 50 00 00 00    lea    0x50(%rip),%rdi        # 100000f92 <_main+0x72>
   100000f42:   48 89 45 f0             mov    %rax,-0x10(%rbp)  #给p赋值
   100000f46:   48 8b 45 f0             mov    -0x10(%rbp),%rax  #
   100000f4a:   48 89 45 e8             mov    %rax,-0x18(%rbp)  #给q赋值
   100000f4e:   48 8b 75 f0             mov    -0x10(%rbp),%rsi
   100000f52:   48 8b 55 e8             mov    -0x18(%rbp),%rdx
   100000f56:   b0 00                   mov    $0x0,%al
   100000f58:   e8 13 00 00 00          callq  100000f70 <_main+0x50>
   100000f5d:   31 c9                   xor    %ecx,%ecx
   100000f5f:   89 45 e4                mov    %eax,-0x1c(%rbp)
   100000f62:   89 c8                   mov    %ecx,%eax
   100000f64:   48 83 c4 20             add    $0x20,%rsp
   100000f68:   5d                      pop    %rbp
   100000f69:   c3                      retq

从上面反汇编的代码看到,至少在我的机器上的g++,对于引用的实现,它就是个普通的变量,它也实实在在地占有栈内存。

那么如果让我写编译器来实现上面这段代码中的引用呢,实际上在这个例子中是可以做到不需要为q 分配额外的内存空间的,因为在编译的阶段,完全可以把用到 q 的地方,采用 栈基址+偏移量(bp + offset)的方式引用到变量p的地址,然后再偷偷解引用即可。

搜索了一下,有一篇类似探讨C++引用的文章 《深入分析C++引用》 这篇文章写的不错,结论也跟我猜的类似:

结论

C++标准并没有规定引用到底占不占内存。大部分编译器对于引用的实现,引用就是一个常量指针,是一种会被编译器自动解引用的指针。

把上面的代码转化一下:

A * p = new A;
A& q = *p;  => A* const m = p;

注意关键点!在于意识到自动解引用是编译器干的事!

我说C++很多知识点为什么那么难记,因为编译器干了好多事。

显然上面的引用的写法是比用常量指针的写法更加简洁。那么除了写起来简洁,还有啥优点?
1. 声明引用的同时必须对其进行初始化 。// 我想好处就是对于C++程序员来说,就可以不用像Java程序员那样蛋疼,动不动就Null Pointer Exception, 动不动就得写个 if(null != obj)。引用确实是个好东西。
2. 引用声明结束后,不能作为别的变量的别名。 // 我想好处就是限制程序员把指针搞来搞去把自己都给搞晕了。

综上,C++的引用是个好东西,只不过得花点时间理解它。
orangepi 5 plus ubuntu24.04上安装redroid OrangePi 5 Plus运行reDroid云手机方案总结 在RK3588+Ubuntu 24.04上部署reDroid(Android容器化方案)的关键步骤: 内核要求:确保启用binderfs(无需ashmem,新版reDroid使用memfd替代); 安装流程: 安装Docker并配置代理加速镜像拉取; 拉取reDroid镜像(推荐Android 12/13 ARM64版本); 通过挂载binderfs启动容器,指定分辨率与DPI参数; 多实例管理: 脚本化创建多个容器(如8个实例),分配独立端口 阅读详情

相关推荐

几何修复_ANSYS流体分析:几何前处理

建模及几何处理工具非常多,选择起来让人眼花缭乱。对于仿真而言,高效的对几何进行清理及生成符合仿真要求的几何至关重要。ANSYS SpaceClaim Direct Modeler是基于直接建模思想的新一代3D高效率建模和几何编辑修补软件。SCDM提供了当今最快速、最富有创意的直接建模解决方案。由于它的直接建模能力即使对于导入的其它3D模型(如catia、proe、solid works创建的几何)...

weixin_35778830的博客 2416

c++中引用总结

一、变量的引用 引用:就是一个变量的别名,对引用的操作与对变量的直接操作完全一样。 定义方法:例子 char ch; char&amp; rp = ch; (1)引用本身不占用内存,只是变量的别名。 (2)引用中&amp;不再是取地址符。 (3)定义一个引用必须要进行初始化。 二、引用作为参数 (1)传入实参本身,不创建变量副本、避免内存的开销,提升程序效率。 (2)函数中,对...

liuzubing的博客 288

校招总结—FPGA从入门到放弃

校招总结—FPGA从入门到放弃 感谢咸鱼FPGA的授权转发,原文地址为https://www.cnblogs.com/xianyufpga/ 其实 offer 早就定下来了,最近忙着入党考试,现在才腾出时间来写个总结。我校招开始于 7 月底,算是比较晚了,后面加了各大校招交流群,发现很多同学都是过完年后就开始打磨项目、复习基础、寻找实习。对比之下我这准备确实仓促,不过结果还算满意。 ...

qq_31515205的博客 8604

C++小知识之指针和引用的区别(温故而知新)

C++小知识之指针和引用的区别   温故而知新,指针和引用的概念,大学时都已熟知,实际用的时候往往又有些疑惑,故深入探究一下。 从概念上讲。指针从本质上讲就是存放变量地址的一个变量,在逻辑上是独立的,它可以被改变,包括其所指向的地址的改变和其指向的地址中所存放的数据的改变。 而引用是一个别名,它在逻辑上不是独立的,它的存在具有依附性,所以引用必须在一开始就被初始化,而且其

浪的专栏 772

瑞芯微RK3576开发板实战:6TOPS NPU如何加速你的AIoT项目(附性能测试)

本文以瑞芯微RK3576开发板为核心,深入探讨其6TOPS NPU在AIoT项目中的实战应用。通过详细的性能测试对比,展示了NPU如何将AI模型推理速度提升15倍以上,并大幅降低CPU负载。文章涵盖从环境搭建、模型转换优化到多屏异显与系统级调优的全流程,为开发者提供了将硬件算力转化为实际项目加速效果的完整指南。

oauth7security的博客 820

基于Codex/Claude Code的学术技能包:13个Skill实现科研全流程自动化

写论文最头疼的是什么?是面对海量文献无从下手,还是实验数据一团乱麻,或者是好不容易有了结果,却卡在写作和格式调整上?如果你也经历过从选题到投稿的完整科研周期,就会明白每个环节都可能消耗大量时间精力。今天要分享的这套工具链,正是为了解决这些痛点而生——基于 Codex 和 Claude Code 平台的学术技能包(Academic Skills),它通过 13 个精心设计的 Skill,将一篇论文从 0 到 1 的全流程自动化、标准化,让你能更专注于研究本身。 这套技能包并非单一工具,而是一个覆盖文献阅读、数

weixin_33979203的博客 541

C++温故而知新----1

存疑概念: 。名称空间声明的名称链接性默认为外部的(除非引用了常量)? 提醒: 。引用声明时就得初始化 。当函数参数为引用时,实参应是变量,不能是表达式 。对于基本类型,cin使用引用 //cin >> n; 。const数据的指针和引用优先于非const数据的指针和引用匹配 重要知识点: 第八章  8.2 引用 8.2.3引用的属性和特别之处 临时变量、引用参数和cons

qq_38285023的博客 245

安卓逆向实战:用Batch Apktool 3.8.0快速汉化APK的完整流程

本文详细解析了如何使用Batch Apktool 3.8.0进行安卓APK汉化的完整流程,包括环境配置、反编译、资源解析、深度汉化、重构建与签名优化等关键步骤。通过这款集成化逆向工具,开发者可以高效完成APK汉化,提升工作效率。

s1t2u3的博客 1096

【C++】:右值引用

右值引用

Mr.Sugarcane 1050

YOLOv5模型转换陷阱:从PT到RKNN的置信度异常与乱框问题深度解析

本文深度解析了YOLOv5模型从PT到RKNN转换过程中的置信度异常与检测框错乱问题,揭示了NPU硬件特性与模型结构不匹配的根本原因。通过详细的解决方案和实操步骤,包括模型修改、转换流程配置和验证技巧,帮助开发者有效解决这一常见部署难题,提升模型在瑞芯微芯片上的推理性能。

weixin_29062255的博客 902

高性能C#上位机:多串口并发,百万数据不卡顿

去年做了一个环境监测项目,要对接32个串口传感器,每个传感器每秒发10条数据,一天下来就是2700多万条数据,之前的老程序跑起来UI直接卡死,数据丢包率高达10%,存到数据库要卡半天,客户要求数据丢包率为0,UI响应延迟≤100ms,百万级数据查询≤1s。这套多串口通信方案已经用在了我们公司10多个项目上,最多支持64个串口同时并发,每秒处理3000条数据,完全不卡顿,数据零丢包,客户非常满意,最近做的一个光伏监测项目,对接了48个串口传感器,稳定运行了6个月,没有出过任何问题。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 423

比较全面的C++面试笔试题整理,温故而知新(加入C++11)

gcc 和 g++的区别 简单来说,gcc与g++都是GNU(组织)的一个编译器。需要注意以下几点: gcc与g++都可以编译c代码与c++代码。但是:后缀为.c的,gcc把它当做C程序,而g++当做是C++程序;后缀为.cpp的,两者都会认为是C++程序。 编译阶段,g++会调用gcc,对于c++代码,两者是等价的,但是因为gcc命令不能自动和C++程序使用的库联接,所以通常用g++来完成...

首席技术总监的专栏 4812

机器人中的数值优化(一)—— 数学优化、凸集合与凸函数

本系列文章主要是我在学习《数值优化》过程中的一些笔记和相关思考,主要的学习资料是深蓝学院的课程《机器人中的数值优化》和高立编著的《数值最优化方法》等,本系列文章篇数较多,不定期更新,上半部分介绍无约束优化,下半部分介绍带约束的优化,中间会穿插一些路径规划方面的应用实例。

慕羽★的博客 2521

【C++ STL 温故而知新 002】Lists(链表)

【C++ STL 温故而知新 002】Lists(链表)

DaveBobo的博客 579

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

深度学习工具包 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#语言,做的是Unity3D,现在需要用UE4开发(UE4是使用蓝图及C++语言),太长时间没用C++所以先简单复习一下基本的语法知识)下面仅仅是学习中的小结(简单笔记,作为自己的总结再次写一下,如有不妥望指正,一直在路上共同进步) 正文: 1、 cout << "Hello World!\...

qq_42855293的博客 230

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

【温故而知新-02】C++函数参数传递

在C++中,函数参数的传递有六种不同的情况:在实际C++使用中,前四种是经常使用到的参数传递方式,后两种可能使用频次不多,但是在阅读其他项目源码时可能会遇见!函数的参数传递有两个概念:【形参和实参的参数传递】 、【 函数调用过程】。每次函数调用,都会重新创建函数的形参,并使用传入的实参对形参进行初始化(形参初始化的机理与变量初始化一样)。重磅一句话:函数形参的类型决定了形参与实参的交互方式。如果形参的类型是引用类型,那么它将绑定到对应的实参上;否则,会将实参的值拷贝后赋值给形参。总结一下:1、函数调用需要开

iriczhao的博客 859

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

C++小知识之指针和引用的区别

温故而知新,指针和引用的概念,大学时都已熟知,实际用的时候往往又有些疑惑,故深入探究一下。 从概念上讲。指针从本质上讲就是存放变量地址的一个变量,在逻辑上是独立的,它可以被改变,包括其所指向的地址的改变和其指向的地址中所存放的数据的改变。 而引用是一个别名,它在逻辑上不是独立的,它的存在具有依附性,所以引用必须在一开始就被初始化,而且其引用的对象在其整个生命周期中是不能被改变的(自

程序猿GTC 1万+

c++值传递,指针,引用使用总结

** 更新时间:2020-09-10 ** 温故而知新,每次重温一遍知识点,都有新的见解。 参考: 函数何时值传递,何时指针,何时引用传递总结 C/C++的值传递,指针传值和引用传值的区别 C++ 什么时候使用指针?什么时候使用引用?什么时候应该按值传递? 3种传递的区别代码: //值传递 //void mySwap(int a, int b) //{ // cout << "mySwap:\t&a = " << &a << ", \t&b = "

Happinessคิดถึง的博客 233

C++中的引用

      最近重新看C++,看到些以前没注意的DD,温故而知新,暂且记下。      引用是能自动间接引用的一种指针,即不必使用间接引用运算符“*”,就可以得到一个引用值。引用可以为变量起别名,它主要用作函数参数以及函数的返回类型。 1 引用的定义     如  int i;      int &j=i;   j是i的引用。(1) 定义引用时,必须立即对它进行初始化,不能定义

blueshelly的专栏 716

C C++最全C语言 C++中的union用法总结(包懂),温故而知新

所以,我们在C++中使用union时,尽量保持C语言中使用union的风格,尽量不要让union带有对象。那些年,我那清纯的大一。对大学的憧憬,对计算机的好奇,对编程的未知,就是这本书,这本该死的《C语言程序设计》,把我带上了“程序猿”这条不归路。本来union本就是从C语言中的,如果我们在C++中继续按照C语言的那种方式使用union,那是没有问题的。5.union类型可以出现在结构体类型定义中,也可以定义union数组,反之,结构体也可以出现在union类型定义中,数组也可以作为union的成员。

2401_84978552的博客 2091

【温故而知新】C和C++10:关于const限定符

const关键字来源自constant

Workshop of Wenjie.Yin 1053

C++中引用和指针的区别

温故而知新,指针和引用的概念,大学时都已熟知,实际用的时候往往又有些疑惑,故深入探究一下。 从概念上讲。指针从本质上讲就是存放变量地址的一个变量,在逻辑上是独立的,它可以被改变,包括其所指向的地址的改变和其指向的地址中所存放的数据的改变。 而引用是一个别名,它在逻辑上不是独立的,它的存在具有依附性,所以引用必须在一开始就被初始化,而且其引用的对象在其整个生命周期中是不能被改变的(自

猪少爷的专栏 529

c++温故而知新

que遍历 #include<iostream> #include<queue> using namespace std; int main(int argc, char* argv[]) { queue<int> myqueue; myqueue.push(1); myqueue.push(2); myqueue.push(3); int myqueue_size = myqueue.size(); for(int i = 0;

秋风清,秋月明 241

C++ 指针和引用的区别

温故而知新,指针和引用的概念,大学时都已熟知,实际用的时候往往又有些疑惑,故深入探究一下。 [b]1.从概念上讲[/b] 指针从本质上讲就是存放变量地址的一个变量,在逻辑上是独立的,它可以被改变,包括其所指向的地址的改变和其指向的地址中所存放的数据的改变。 而引用是一个别名,它在逻辑上不是独立的,它的存在具有依附性,所以引用必须在一开始就被初始化,而且其引用...

中苑 221

温故而知新二(C++)

C++语法温故

weixin_43155199的博客 357
上一篇: [温故而知新] 《深度探索c++对象模型》——站在对象模型的尖端
下一篇: [温故而知新] 《Linux/Unix系统编程手册》——文件I/O
小灰马
博客等级 码龄17年 55粉丝 42原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值