一些容易混淆的C++概念

openEuler系统下安装Google Chrome浏览器全攻略(附依赖问题解决方案) 本文详细介绍了在openEuler系统上安装Google Chrome浏览器的完整指南,包括环境准备、多种安装方式、依赖问题解决方案及性能优化技巧。针对openEuler特有的软件生态和依赖管理机制,提供了实用的命令和配置方法,帮助用户克服安装过程中的常见障碍,实现流畅的Chrome使用体验。 阅读详情
左值,左值引用,右值,右值引用,通用引用
关于左值与右值

首先,左值和右值并不是指常规的表达式左边的值和表达式右边的值,英文中的lvalue和rvalue中的“l”’指location,即可以寻址的值,而“r”指read,即右值是不可寻址的。

左值引用

格式为int& i,左值引用只能传入左值。因此我们在使用拷贝构造函数和拷贝赋值函数时需要临时变量存放右值。

右值引用

格式为int&& i
意义:
右值引用是用来支持转移语义的。转移语义可以将资源 ( 堆,系统对象等 ) 从一个对象转移到另一个对象,这样能够减少不必要的临时对象的创建、拷贝以及销毁,能够大幅度提高 C++ 应用程序的性能。临时对象的维护 ( 创建和销毁 ) 对性能有严重影响。
右值引用中变量的区分:
对于int&&x = 2;
我们知道x的类型是右值引用,指向一个右值,但实际上x是左值还是右值呢?事实上,在C++11中这样规定:若x是有名字,则x为左值,否则x为右值。那么问题来了,什么是有名字,什么是无名?这里又涉及一个无名右值引用和有名右值引用。
无名右值引用:
一般由static_cast < T&& >(t)转换操作转换而来
也可以用标准库提供的std::move()来将左值转换成右值引用
有名右值引用:
即T&&类型的引用。
具体使用:
上面提到右值引用是用来支持转移语义,减少不必要的临时对象的创建等。这里需要引用一个例子:

class MyString { 
 private: 
  char* _data; 
  size_t   _len; 
  void _init_data(const char *s) { 
    _data = new char[_len+1]; 
    memcpy(_data, s, _len); 
    _data[_len] = '\0'; 
  } 
 public: 
  MyString() { 
    _data = NULL; 
    _len = 0; 
  } 

  MyString(const char* p) { 
    _len = strlen (p); 
    _init_data(p); 
  } 

  MyString(const MyString& str) { 
    _len = str._len; 
    _init_data(str._data); 
    std::cout << "Copy Constructor is called! source: " << str._data << std::endl; 
  } 

  MyString& operator=(const MyString& str) { 
    if (this != &str) { 
      _len = str._len; 
      _init_data(str._data); 
    } 
    std::cout << "Copy Assignment is called! source: " << str._data << std::endl; 
    return *this; 
  } 

  virtual ~MyString() { 
    if (_data) free(_data); 
  } 
 }; 

 int main() { 
  MyString a; 
  a = MyString("Hello"); 
  std::vector<MyString> vec; 
  vec.push_back(MyString("World")); 
 }

这里对a的赋值调用了拷贝构造函数,对vec的赋值调用了拷贝赋值函数,但是由于传入的变量为临时变量,增加了没有必要的资源的申请和释放。
一个比较好的解决方法是使用转移语义:

MyString(MyString&& str) { 
    std::cout << "Move Constructor is called! source: " << str._data << std::endl; 
    _len = str._len; 
    _data = str._data; 
    str._len = 0; 
    str._data = NULL; 
 }

在这个拷贝构造函数中,我们使用了右值引用,减少不必要的资源申请和释放。
需要注意的是:

  1. 参数(右值)的符号必须是右值引用符号,即“&&”。
  2. 参数(右值)不可以是常量,因为我们需要修改右值。因此不能是const类型。
  3. 参数(右值)的资源链接和标记必须修改。否则,右值的析构函数就会释放资源。转移到新对象的资源也就无效了。

通过转移语义和右值引用的使用,减少了不必要的资源分配,提高了效率。
而move函数就是讲传入的左值引用转换成右值引用。
通用引用
有时候在参数传递时的引用类型可能是左值引用,也可能是右值引用,但具体是什么类型需要程序在运行时判断,这时我们就将该引用称为通用引用。通用引用的格式是T&&,其中T是需要推导的数据类型。通用引用一般用于两个方面,一个是模板类型,另一个是auto声明。因此,当需要类型判断时就涉及到通用引用了。而当右值初始化通用引用时即为右值引用。反之为左值引用。

值传递与引用传递
值传递

被调函数的参数被作为被调函数的局部变量处理,值传递的特点是被调函数对形式参数的任何操作都是作为局部变量进行的,不会影响主调函数的实参变量的值。
可以认为传递指针也是一种值传递,只是传递的是地址值,但是可以对这个地址值中存放的内容进行修改,而存放这个地址值的指针是不会变化的。如果要改变存放该地址值的指针,需要传入的是该指针的地址,所以可以使用指针的指针或者指针的引用。

引用传递

在引用传递过程中,被调用函数的形式参数虽然也作为局部变量在栈中开辟了内存空间,但是这时存放的是由主调函数放进来的实参变量的地址。被调函数通过间接寻址访问到从主调函数传入的参数的地址,若改变被调函数中参数地址中存放的值,则主调函数中对应的变量地址中存放的值也会改变。

野指针与空指针

野指针指的是指向不可访问内存的指针,指针在声明时并不会自动成为空指针,其默认值时随机的,所以在定义指针的时候要设置为NULL或对其初始化。而由于所指向内存被释放而居无定所的指针也是野指针,这时要将指针的值设为NULL。

inline与宏

对于C++而言,基本上用内联函数替代了宏,原因在于宏容易出错,在运行时可能会出现不可预测的错误,而且不可调试,而且不可操作类的私有成员。而说内联函数可以调试是因为在程序的调试板块了并没有真正内联,编译器会为他生成含有调试信息的可执行代码。只有在程序的发行板块中才真正内联。
使用内联函数
内联函数关键字为inline,必须与函数定义共同使用才有效,仅将 inline 放在函数声明前面不起任何作用。定义在类声明之中的成员函数将自动地成为内联函数,但是是否会真正内联还在于函数定义是什么样的(内联函数中的代码不能过长,而且不能有循环语句和开关语句,只有当函数只有 10 行甚至更少时才将其定义为内联函数.)。
当然内联函数定义也可以放在源文件中,但此时只有定义的那个源文件可以用它,而且必须为每个源文件拷贝一份定义(即每个源文件里的定义必须是完全相同的),当然即使是放在头文件中,也是对每个定义做一份拷贝,只不过是编译器替你完成这种拷贝罢了。所以最好放在头文件中。只要 inline 函数的定义在某个源文件中只出现一次,而且在所有源文件中,其定义必须是完全相同的就可以。
但是内联函数有个弊端就是它只能解决掉函数调用的开销,即参数压栈,返回等开销。实际上若函数执行的开销要大于函数调用的开销,则内联函数的作用就会变得很小。

函数模板,模板函数,模板类,类模板

函数模板是对一系列模样相同的函数的说明与描述,他不是某一个具体的函数,不能被执行,只有被实例化才能被执行

template <typename RET_T , typename IN1_T , typename IN2_T >
RET_T prifunc2(IN1_T in1 , IN2_T in2)
{
    RET_T ret;
    ret = in1 +in2;
    cout<<"in1 = "<<in1<<endl;
    cout<<"in2 = "<<in2<<endl;
    ret = in1+in2 ;
    cout<<"ret = "<<ret<<endl;
    return ret;
}
int main(){
    int v = prifunc2<double, int ,int>(11,22);//返回值放在第一位。
    int vv = prifunc2<double>(33,44);//可以只提供返回值的声明,其他会自行推断出来。
}

类模板与函数模板类似,是对模样相同的类的描述,使用的时候要实例化,说明具体的类型。

template <class T>          //带参数T的类模板说明
class Point{
public:
    Point(T = 0,T = 0);     //类的构造函数
    Point(Point&);          //类的复制构造函数
    T Distance(Point&);     //返回类型为T的成员函数
private:
    T x,y;
};
Point<int> iobj(3,4);  //该对象产生一个int型的点(3,4)
指针常量与常量指针

指针常量:是指定义的指针只能在定义的时候初始化,之后不能改变其值。
格式:[数据类型][*][const][指针常量名称]
例如:char* const name
常量指针:是指指向常量的指针,因为常量指针指向的对象是常量,因此这个对象的值是不能够改变的。
格式:[数据类型][const][*][常量指针名称]
例如:char const* name
注意:需要区分的是指针常量是用常量修饰指针,即指针指向的值可以改变,但指针本身不可修改。而常量指针是指针指向一个常量,指针本身可以修改,指向的内容不可修改。

Shopee商品详情页反爬实战:手把手逆向x-sap-Ri和x-sap-Sec参数(附完整调试过程) 本文详细解析了Shopee商品详情页反爬机制中的x-sap-Ri和x-sap-Sec参数逆向过程。通过JS逆向技术,从环境数据采集到多层哈希运算,完整拆解了这两个关键参数的生成逻辑,并提供了实战技巧和Node.js实现方案,帮助开发者应对Shopee的动态加密挑战。 阅读详情

相关推荐

论文理解【LLM-OR】——【OptMATH】A Scalable Bidirectional Data Synthesis Framework for Optimization Modeling

本文提出 LLM-OR 领域的双向数据合成框架 OptMATH,从已有 MF/PD 出发反向生成 NL,再使用 AutoFormulator 进行正向建模,通过最优值匹配 rejection sampling 确保语义一致性。实现了难度可控的语义一致数据合成

佚失的诗篇 499

C++学习(一八五)ld链接器是什么

ld--GNU连接器。 ld是GNU工具链中的一个软件,主要用于将obj文件连接成可执行文件。同时你能使用自己的脚本来控制ld的行为,这是你可以通过-T选项选择你的脚本而不是默认的。 ld是GNU的链接器,支持生成大量的可执行文件格式,它是一款复杂而快捷的工具。 ld有许多灵活的参数来控制其链接过程。这里只介绍主要几个参数。 如果你希望用example.ld作为链接脚本,可以这样使用: ld -T example.ld 如果你想把一系列的.o文件链接到另外一个.o文件中,可以像这样用ld: ..

hankern的专栏 1849

Class AB OPA STB仿真相位异常:从corner case到碰撞电离的排查与规避

本文深入分析了Class AB运算放大器(OPA)在STB稳定性仿真中,特定工艺角(corner case)下出现相位从0°开始的异常现象。排查发现,其根本原因在于高Vds引发的碰撞电离效应,通过衬底和电源网络引入了隐藏的正反馈通路。文章对比了修改衬底连接与优化电路降低Vds两种解决方案,并基于工程实践推荐了代价更小、兼容性更好的电路优化方案,成功规避了问题并完成流片验证。

grape的博客 636

cpp混淆详解

C++代码混淆是一种技术,旨在通过修改代码的结构和符号名称,使其难以被人类阅读和理解,同时保持代码的功能和性能不变。这种技术常用于保护知识产权,防止反向工程和代码盗窃。

N阶二进制的博客 3063

制作 img系统镜像的详细方法

      I.MX6开发板目前支持从TF卡和eMMC启动,启动时,由于各个不同的启动文件对路径有不同的要求,例如uboot文件要求位于启动设备的某个块,dtb文件要求在FAT分区上,文件系统要求在Linux分区上,基于此,我们目前采用将映像制作成img文件的方式,这样可以更简单完成对启动卡的制作。 关于如何制作img,方法如下:方法一  Windows下面利用Win32工具1.   准备我司提供...

armkits的博客 4万+

ST-Link V2的隐藏技能:多通道串口调试的终极指南

本文深入探讨了ST-Link V2的多通道串口调试功能,突破传统烧录工具的限制。通过详细的硬件配置、Arduino IDE设置和实战案例,展示了如何利用SWD接口实现多通道数据监控,提升STM32F103C8T6等开发板的调试效率。文章还提供了PCB布局优化和性能调优技巧,助力开发者充分发挥ST-Link V2的潜能。

weixin_29285605的博客 357

c/c++混淆点总结

最近学ds教材跟教辅是两种语言真的把c/c++搞的满混淆的 查阅很多资料整理了一些不同的语法点,希望自己手写代码的时候不要不懂装懂鸭~ 1,在C++中,民,局部变量可以在一个程序块内在任何地方声明,在C中,局部变量必须在程序块的开始部分,即在所有"操作"语句之前声明,请注意,C99标准中取消了这种限制。例如:在C++中,for语句中可以出现for(int i=0;i<5;i++),即定义i的...

Abigail路小雨的博客 1603

云桌面如何部署?云桌面系统方案部署详细教程

云桌面作为一种比较新的技术工具,核心解决的场景是方便设计师的灵活办公,本身技术就是非常的灵活性,所以在安装部署方面青椒云也做到了十足的灵活。

2301_79113726的博客 1633

使用 ld 命令链接目标文件生成可执行文件

使用ld链接目标文件生成可执行文件,用于取代命令g++,仅仅用于学习ld命令的使用,不用于实际的项目编译。 首先看一个简单的C++源文件main.cpp。 // //@file:main.cpp // #include &amp;amp;amp;lt;iostream&amp;amp;amp;gt; using namespace std; int main() { cout&amp;amp;amp;lt;&amp;amp;amp;l

Doublelv 的博客专栏。 8190

MMSE (Minimum Mean Square Error)均衡原理讲解

MMSE是一种将接收数据的MSE(均方误差)最小化的模型。有了这句话,很多问题就会在你的脑海中蹦出来。 什么是均方误差?最小化MSE "的物理含义是什么? 等等。 让我们从一个我们现在已经非常熟悉的通道模型开始。(我希望你现在也熟悉下面的表达方式。) MMSE作为一种均衡器,是一种后处理算法,它可以帮助我们找出接收到的数据,使之尽可能地接近原始数据(传输数据)。简而言之,MMSE中最重要的步骤是找到一个如下图所示的矩阵G。如果我们假设没有噪声,这个[G]矩阵可以简单的作为信道矩阵(H^-1)的倒数。但

Celeste的博客 4万+

Android流畅度优化实战:从掉帧定位到布局与渲染调优

在移动应用开发中,性能优化是决定用户体验与留存率的关键环节,其中Android流畅度优化更是核心命题。用户感知的“卡顿”往往并非持续低帧率,而是由于掉帧率波动引发的偶发不流畅。本文从性能优化理论出发,系统讲解如何使用Systrace、CPU Profiler等工具定位掉帧瓶颈,深入分析布局层级过深、过度绘制、对象分配与GC压力等常见诱因。同时结合冷启动耗时、列表滚动掉帧、Bitmap加载等真实工程案例,阐述从应用层到系统层的分级优化策略,并给出低端机适配、异步化改造及线上监控体系搭建的实践方案。内容覆盖布局

weixin_29185493的博客 201

如何提升代码的安全性 —— 代码混淆

目录一、背景1.1 Android应用安全存在多重隐患二、代码混淆2.1 代码混淆的原理2.2 代码混淆的方法2.3 常见的代码混淆方式三、 C/C++ 代码混淆3.1 Obfuscator-LLVM实现C/C++混淆3.1.1 常见的混淆方法3.1.2其他常见的C/C++混淆手段:四、代码混淆可能带来的问题 一、背景 1.1 Android应用安全存在多重隐患 代码可逆向:客户端App的逻辑能够被轻易获取和逆向,得到代码和程序中的敏感数据; 功能泄漏:客户端App中高权限行为和功能被其他未授权的应

ZP1015 2978

RK3506开发板实战:5分钟搞定开源鸿蒙OpenHarmony5.1+星闪功能配置

本文提供了一份基于RK3506开发板快速配置开源鸿蒙OpenHarmony 5.1并启用星闪功能的实战指南。文章详细介绍了从开发环境搭建、系统镜像编译烧录,到星闪驱动加载验证、应用开发及性能调优的全流程,帮助开发者高效上手,将新一代短距无线通信技术应用于物联网项目。

time3的博客 656

C++易混淆概念

1. 引用和指针有什么区别? 本质:一个是别名,一个是地址1. 指针可以在运行时改变其所指向的值,引用一旦和某个对象绑定就不再改变2. 引用没有const, 指针有const 3. 从内存上看,指针会分配内存区域,引用不会,它仅仅是一个别名4. 在参数传递时,引用会做类型检查,而指针不会5. 引用不能为空,指针可以为空 【类型检查、const、内存、值、空】 2. const和...

dongkai0918的博客 187

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

C++中容易混淆的概念

转载自知乎: 阿里面试必会20道C++面试题! - 棋子的文章 - 知乎 https://zhuanlan.zhihu.com/p/85566239 作者:棋子 链接:https://zhuanlan.zhihu.com/p/85566239 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 1、如何初始化一个指针数组。 解析:首先明确一个概念,就是...

专注分享 AI 干货,社交平台会同步更新配套资源(同名),欢迎大家关注 330

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

C++中几个易混淆的概念

  函数指针—指针函数 数组指针—指针数组 类模板—模板类 函数模板—模板函数     名正言顺,中国有句古话:名不正则言不顺。一样东西,名字如果用的不好,不但听起来不舒服,而且真实的本质也容易被掩盖。如果一样东西有一个好名字,我们就能更容易的记住它和理解它。       在现代汉语中,许多词的重点都在后面,比如下面我们经常看到的两个词语。       冰雪聪明。       聪明

痞子龙3D编程 1461

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

c++中易混淆的概念

(1)局部变量 全局变量 静态变量 const常量 寄存器变量 宏定义的常量 static变量 局部变量: 指在函数(过程)内部定义的变量 作用域为定义该变量的函数 内存分配: 在栈中按地址从高到低分配; 全局变量: 通常在文件开头定义(理想位置),当这些函数以及同一个程序中的其他源程序文件中的某些函数需要使用该全局变量时 在函数内部对该变量使用extern加以说明他是外部的; 作用域

Owen_1的专栏 916

C++进阶之易混淆概念

函数模板和模板函数,类模板和模板类,指针数组和数组指针之间的区别和定义

xiaoqingxin3424的博客 278

关于C++几个容易混淆的概念总结

1.函数指针和指针函数   函数指针说的就是一个指针,但这个指针指向的函数,不是普通的基本数据类型或者类对象。函数指针的定义: int (*func)(int a, int b);      // 声明函数指针   指针函数表示的是函数的返回类型是一个指针的函数,该指针用于保存函数返回的地址,以供其他调用者使用。指针函数的定义: int *f(int a, int...

banpichu1955的博客 186

初学c/c++出现的一些易混淆概念

同在csdn看到的一篇文章,觉得不错,做个笔记。 文章原址请转http://blog.youkuaiyun.com/sunxx1986/article/details/6619144 在C++中有好几个这样的术语,但是我们很多时候用的并不正确,几乎是互相替换混淆使用。 函数指针——指针函数  数组指针——指针数组  类模板——模板类  函数模板——模板函数      1.

gzhu_wzb 430

容易混淆的几个c++名词概念

c++中有些名词一直弄不清楚,容易混淆,在这总结一下,加强记忆。参考https://www.cnblogs.com/wangduo/p/5559049.html 函数指针——指针函数 数组指针——指针数组 类模板——模板类 函数模板——模板函数 1.函数指针与指针函数    函数指针的重点是指针。表示的是一个指针,它指向的是一个函数,可用作回调函数,可作为形参,例子:   int   ...

漫时光,慢慢 271

c++容易混淆的概念

1、c++标准库和STL之间的关系 简单地说,C++ 标准库包含了三个部分:C 标准库的 C++ 版本;C++ IO 库;C++ STL  IO 库最常用的 HEADER 是  头文件  STL 包括了很多容器类(vector, list, deque, stack...),还有 functinal, algorithm, iterator 等  C 标准库的 C++ 版本:设原来头文件是

KinboSong的博客 506

C++中一些容易混淆的概念

文章目录指针函数和函数指针typedef和define区别指针常量和常量指针 指针函数和函数指针 指针函数:是指带指针的函数,本身是函数,只是返回值是某一个类型的指针。 int *fun(int x); 函数指针:指向函数的指针变量,即本质是一个指针变量。 int (*fun)(int x); void (*fun)();//定义函数指针 void test(); int main() { ...

sun 480

c++ 易混淆概念

1.include""与include<>的区别 include<>用于标准或系统提供的头文件; include""常用于程序员自己的头文件。 2. .h文件与.hpp文件的区别 ①hpp,其实质是将.cpp的实现代码混入.h头文件当中,定义与实现都包含在同一文件,则该类的调用者只需要include该hpp文件即可,无需再将cpp加入到project中进行编译。而实现代码将直接编译到调用者的obj文件中,不再生成单独的obj,采用hpp将大幅度减小project中...

是鲤鱼啊 290

C++中几个容易混淆的概念——函数的重载、覆盖和隐藏

说实话,刚开始一直都没有注意到隐藏这个概念,以前看书的时候也没有

菜鸟学C/C++ 1415

谈谈C++中三个容易混淆的概念

JAVA中语言中方法(函数)调用有两种特殊的形态:重载与重写;而C++由于增加了virtual这个虚函数关键字,给函数调用又增加了变数:除了重载、重写(也称覆盖)之外还多了隐藏这么一说。 我相信我们绝大多数人写代码时,为了程序的可读性与赶速度的原则,下意识的避开这些类似于脑筋急转弯的语法,尽量使用不同的函数名来区分基类与派生类的函数(当然,不能避开的时候也是非常多的)。 可是有时候,有些面试主

bookish_2010_prj的专栏 710
上一篇: Unity3d-粒子光环
下一篇: C++关于虚类,虚函数以及友元的知识
hellowangld
博客等级 码龄10年 15粉丝 46原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hellowangld

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值