首页
学习
活动
专区
圈层
工具
发布

C++入门(下)

1:引用 1.1:引用概念 引用不是新定义一个变量,而是给已经存在的一个变量取一个别名,编译器不会为引用变开辟新的空间,它与它所引用的变量共同占用同一块空间....Function2的函数栈帧,由于博主使用的vs2022编译器没有在函数栈帧销毁之后对那块空间进行清理,因此此时reuslt的值为1 因此,如果函数调用结束时,出了函数作用域,若对象还在,则可以使用引用返回...答案是NO.有些uu们会有些疑惑,这里的变量a和b都没有用const关键字来修饰呐,那么为什么不能使用引用c来接收呢?...语法角度 引用必须初始化,指针可以不初始化. 引用是变量的别名,不开空间,而指针存储的是变量的地址,因此要开空间. 引用不能改变指向,指针可以改变指向....,当对NULL指针进行强制类型转换时,才调用了Function(int *)这个函数在C++98中字面常量0既可以是一个整形数字,也可以是无类型的指针(void*)常量,但是编译器默认情况下将其看成是一个整形常量

8310

【C++】C++入门—(中)

一,函数重载 函数重载:函数重载(Function Overloading)允许在同一个作用域内定义多个同名函数,但这些函数的参数列表必须不同(参数类型、数量或顺序)。...,我们就要再创建一个函数并用数字区别开来,从而保证编译器能区分不同函数。...vs仅在数组末尾一两个位置上设置了检查 arr[20]=1; return 0; } 两次打印x,我们发现x的值竟然被fun函数中的xxx给修改了,这时为什么呢?...首先,func函数是传引用返回给了x那么x就是ret的别名没跑。第二次打印的x的值与xxx一样为1000,这很难不让人联想到x可能是xxx的别名,为什么会造成这种情况呢?...比如在链式结构和属性结构中只有指针才能改变指向引用不能所以必须使用指针。 那么引用与指针的关系到底是什么呢? 在将引用返回的坑那里的时候,代码编译有两个警告: 这里就有人疑问了?

8610
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    【C++11】右值引用和移动语义

    在C++98标准中就已经引入了引用的语法概念,这是一种为已存在的对象创建别名的方式,可以避免指针操作带来的复杂性。...值得注意的是,在VS2019 Release模式以及VS2022的Debug和Release模式下,编译器会进一步优化代码。...,推导出T为const int&,引用折叠,模板实例化为void Function(const int&t) // 所以Function内部会编译报错,x不能++ Function(b); //...std::move(b)右值,推导出T为const int,模板实例化为void Function(const int&&t) // 所以Function内部会编译报错,x不能++ Function...这意味着即使一个右值被右值引用绑定后,该右值引用变量的表达式属性仍然是左值。因此,Function函数中的t具有左值属性。若直接将t传递给下层函数Fun,都将匹配Fun的左值引用版本。

    23210

    C++_ ‘&‘ 引用详解

    引用: 引用是对一个变量 或 对象(后期讲解) 取的别名, 当引用初始化为某个变量, 便可以使用该引用名称或变量名称来指向此变量. 1.引用的定义: 定义别名方式: 真名的类型 & 别名 = 真名..., 引用可以引用指针类型变量, 结构体类型变量…, 可以给引用的别名引用, 但无实际意义. 3.引用形参: 形参 : 在函数定义中出现的参数可以看做是一个占位符,它没有数据,只能等到函数被调用时接收传递进来的数据...引用形参为什么可以改变实参的内容_关于形参内部表示形式: ?...引用与指针对比: 当引用作为函数参数时, 与指针作为函数参数效果相同, 但引用不会产生指向对象的副本,节省时间和空间 理论来讲: 引用是一个别名,不占用内存(并不确切) 指针是一个变量, 一般占用**4...字节(与编译环境也有关)**来存储地址 引用在定义时就被初始化, 引用的对象不能改变, 而指针的指向可以更改, 像const常量指针 引用的变量在定义前必须初始化, 指针不需要, 并且指针还可以指向空地址

    1.3K40

    C++11进阶之路:右值引用和移动语义,让代码跑得更快!

    下面我们来看看右值:1. 10这是一个字面量常量不能取地址。 2.x+y,这是一个求值表达式,返回的是临时对象,也不能取地址。...3. fmin(x,y) 这是一个传值返回的函数,返回的仍然是一个临时对象,不能取地址。...也就意味着当右值被右值引用引用后,其右值引用变量的属性是左值的 在语法层面上,左值引用与右值引用都是取别名,不开空间的。在底层来看,其本质都是指针,没有上面区别。...需要注意的是,在 VS2019 Release 和 VS2022 Debug/Release下,以下代码会进一步优化:直接构造要返回的临时对象,str 本质是临时对象的引用(底层角度用指针实现)。...t) // 所以Function内部会编译报错,x不能++ Function(std::move(b)); // const 右值 } 7.完美转发 上述代码中我们知道,万能引用的模板函数

    13910

    C++入门

    --名字修饰(name Mangling) 为什么C++支持函数重载,而C语言不支持函数重载呢?...Windows下名字修饰规则 对比Linux会发现,windows下vs编译器对函数名字修饰规则相对复杂难懂,但道理都 是类似的,我们就不做细致的研究了。...引用概念上定义一个变量的别名,指针存储一个变量地址。 2. 引用在定义时必须初始化,指针没有要求 3....引用在初始化时引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向任何 一个同类型实体 4. 没有NULL引用,但有NULL指针 5....8.3.2 auto不能推导的场景 1. auto不能作为函数的参数 // 此处代码编译失败,auto不能作为形参类型,因为编译器无法对a的实际类型进行推导 void TestAuto(auto

    41610

    C++面试周刊(3):面试不慌,这样回答指针与引用,青铜秒变王者

    undefined更重要的是思路是否清晰,能不能结合项目经验去解释。面试官往往是项目经理,他每天忙于业务推进,真的会关心你能背出多少条“指针 vs 引用”的区别吗?...✅)2.1 必须使用指针的场景:需要频繁更新/延长初始化的重要数据结构设计需要频繁更新数据结构:数据结构为什么用指针为什么不用引用std::vector内部维护动态数组,存储区可扩容。...没有函数重载 错误:无法将左值‘int’绑定到‘int&&’  fun(1); // OK}template fun(T &&a) 编译时场景为什么用万能引用vector::...面试官视角反问为什么 T&& 还要 std::forward?...、大对象、懒加载、动态分配函数参数、别名访问所有引用/借用、函数参数、高安全要求可变性控制指针指向可变或不可变对象与原对象一致可借用(不可变)或可变借用,编译器保证互斥举例:fn safe() -> &

    20600

    C++面试周刊(3):面试不慌,这样回答指针与引用,青铜秒变王者

    • 这样会到还不够,为什么不能针针对区详细说明 小青疑惑:为什么我全部回答了,面试官还是不满意 ,我回答不高深吗? 2.2 小白(白银级别 工作 3-5 年)面试 1....,不用指针无法解决问题✅) 2.1 必须使用指针的场景:需要频繁更新/延长初始化的重要数据结构设计 需要频繁更新数据结构: 数据结构 为什么用指针 为什么不用引用 std::vector 1....面试官视角反问 为什么 T&& 还要 std::forward?...安全,但不可重新绑定 编译期保证安全,无悬挂 使用场景 缓存、大对象、懒加载、动态分配 函数参数、别名访问 所有引用/借用、函数参数、高安全要求 可变性控制 指针指向可变或不可变对象 与原对象一致 可借用...6 模板 C++17 新特性 std::optional 7 class c++类的成员函数,能作为线程的参数吗 8 编译器 const 如何保证const不变 9 值语义 一道面试题看深拷贝构造函数问题

    14210

    C++基础入门

    C++的第⼀个程序 C++兼容C语⾔绝⼤多数的语法,所以C语⾔实现的helloworld依旧可以运⾏,C++中需要把定义⽂件 代码后缀改为.cpp,vs编译器看到是.cpp就会调⽤C++编译器编译,linux...vs系列编译器是这样的,其他编译器可能会报错。 std::cout标准输出流,它是把数值转换成字符输出到屏幕(终端)上的,如果本身就是字符就不用转换。...<< b; } 结果: 但是要怎么换行呢,我们可以直接用std::endl这是一个函数。...函数声明和定义分离时,缺省参数不能在函数声明和定义中同时出现,规定必须函数声明给缺省值。 缺省参数就是在行参里给一个赋值,就是缺省参数, 不传参时,使用的就是缺省参数,传参时,使⽤指定的实参。...C语⾔实现宏函数也会在预处理时替换展开,但是宏函数实现很复杂很容易出错的,且不⽅便调试,C++设计了inline⽬的就是替代C的宏函数。 vs编译器?

    45510

    C++ —— 剑斩旧我 破茧成蝶—C++11

    需要注意的是在vs2019的release和vs2022的debug和release,下⾯代码会进⼀步优化,直接构造要返回的临时对象,str本质是临时对象的引⽤,底层⻆度⽤指针实现。...// 所以Function内部会编译报错,x不能++ Function(std::move(b));// const 右值 return 0; } 3.8 完美转发 1....内部会编译报错,x不能++ Function(std::move(b));// const 右值 return 0; } 4....⽤对象,包括函数指针、仿函数、 lambda 、 bind 表达式等,存储的可调⽤对象被称为 std::function 的⽬标 若 std::function 不含⽬标,则称它为空 调⽤.../w/cpp/utility/functional/bad_function_call 函数指针、仿函数、 lambda 等可调⽤对象的类型各不相同, std::function 的优势就是统

    57200

    【C++11】{}右值引用移动语义类型分类引用折叠完美转发--C++

    30 }; // the type of il is an initializer_list ,这个类的本质是底层开一个数组,将数据拷贝过来,std::initializer_list内部有两个指针分别指向数组的开始和结束...需要注意的是在vs2019的release和vs2022的debug和release,下面代码会进一步优化,直接构造要返回的临时对象,str本质是临时对象的引用,底层角度用指针实现。...需要注意的是在vs2019的release和vs2022的debug和release,下面代码会进一步优化,直接构造要返回的临时对象,str本质是临时对象的引用,底层角度用指针实现。...内部会编译报错,x不能++ Function(b); // const 左值 // std::move(b)右值,推导出T为const int,模板实例化为void Function(const...int&& t) // 所以Function内部会编译报错,x不能++ Function(std::move(b)); // const 右值 return 0; } 8、完美转发 Function

    46300

    C++基础知识(入门章2)

    inline内联函数 这是一个全新的知识点,我们先来了解一下其概念: • ⽤inline修饰的函数叫做内联函数,编译时C++编译器会在调⽤的地⽅展开内联函数,这样调⽤内联函数就不需要建⽴栈帧了,就可以提...inline适⽤于频繁调⽤的短⼩函数,对于递归函数,代码相对多⼀些的函数,加上inline也会被编译器忽略。...• vs编译器 debug版本下⾯默认是不展开inline的,这样⽅便调试,debug版本想展开需要设置⼀下 以下两个地⽅(如下图指引)。...//#define ADD(a, b) a + b; //#define ADD(a, b) (a + b) // 正确的宏实现 #define ADD(a, b) ((a) + (b)) // 为什么不能加分号...// 为什么要加外⾯的括号? // 为什么要加⾥⾯的括号?

    31210

    【c++】内联-引用-重载

    【c++】引用 2.1 引用的概念 引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。...2.6 引用和指针的区别 在语法概念上引用就是一个别名,没有独立空间,和其引用实体共用同一块空间 在底层实现上实际是有空间的,因为引用是按照指针方式来实现的 int main() { int...引用和指针的不同点: 引用概念上定义一个变量的别名,指针存储一个变量地址。...引用在定义时必须初始化,指针没有要求 引用在初始化时引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向任何一个同类型实体 没有NULL引用,但有NULL指针 在sizeof中含义不同:引用结果为引用类型的大小...引用比指针使用起来相对更安全 语法上区别 引用是别名,不开空间;指针是地址,需要开辟空间存地址 引用必须初始化,指针无要求 引用不能改变指向,指针可以 引用相对更安全,没有空引用,但是有空指针;容易出现野指针

    29610

    【C++】C++基础

    为例,当文件后缀改为.cpp后,vs编译器看到是.cpp就会调用C++编译器编译,当文件后缀改为.c后,vs编译器就会调用C编译器编译;但是linux下要用g++编译,不再是gcc。...vs系列编译器是这样的,其他编译器可能会报错。...const int & 为a1起别名(不能使用 int &起别名,这样可以通过别名修改a,权限放大了。)...• 语法概念上引用是一个变量的取别名不开空间,指针是存储一个变量地址,要开空间(但是实际上在底层引用与指针是一致的,引用就是指针,不过一般来说,我们更关心语法层面的效果)。...• 引用在初始化时引用一个对象后,就不能再引用其他对象;而指针可以在不断地改变指向对象。(以链表为例,删除节点之后再插入节点,需要改变指向,所以这也进一步说明引用无法替代指针。)

    74201

    【C++】入门基础(下)

    语法概念上引用是一个变量的取别名不开空间,指针是存储一个变量的地址,要开空间。 引用在定义时必须初始化,指针建议初始化,但语法上不是必须的。...引用在初始化时引用一个对象后,就不能在引用其他对象,而指针可以不断地改变指向对象。 引用可以直接访问引用对象,指针需要解引用才能才能访问指向对象。...VS编译器debug版本下面默认是不展开inline的,这样方便调试,debug版本想展开需要设置以下两个地方。 inline不建议声明和定义分离到两个文件,分离会导致链接错误。...因为inline被展开,就没有函数地址,链接时会出现错误。 inline对于相对多一些的函数,为什么加上inline也会被编译器忽略呢?...// 为什么要加外⾯的括号? // 为什么要加⾥⾯的括号? int main() { //宏的本质相当于替换 // 为什么不能加分号?

    23610

    C++11特性:初始化列表、右值引用、可变模板

    移动构造函数和移动赋值运算符是 C++11 引入的重要特性,它们通过“窃取”临时对象的资源,避免了不必要的深拷贝,从而提高了性能。 为什么要使用“移动”而不是“拷贝”?...需要注意的是在vs2019的release和vs2022的debug和release,下⾯代码会进⼀步优化,直接构造 要返回的临时对象,str本质是临时对象的引⽤,底层⻆度⽤指针实现。...需要注意的是在vs2019的release和vs2022的debug和release,下⾯代码会进⼀步优化,直接构造 要返回的临时对象,str本质是临时对象的引⽤,底层⻆度⽤指针实现。...8; // b是左值,推导出T为const int&,引用折叠,模板实例化为void Function(const int& t) // 所以Function内部会编译报错,x不能++ Function...内部会编译报错,x不能++ Function(std::move(b)); // const 右值 return 0; } 4.

    51000

    【C++篇】迈入新世界的大门——初识C++(下篇)

    一个变量可以有多个引用 引用一旦引用一个实体,再也不能引用其他实体 #include using namespace std; int main() { int a = 10...return ret;//函数返回后销毁,此时此块空间已经还给操作系统,不能使用 } 只是相对来说更安全一些 补充: 在第一条我们是这么说的: 语法概念上引⽤是⼀个变量的取别名不开空间,指针是存储⼀个变量地址...// 为什么要加外面的括号? // 为什么要加里面的括号?...inline ⽤inline修饰的函数叫做内联函数,编译时C++编译器会在调⽤的地⽅展开内联函数,这样调⽤内联函数就不需要建⽴栈帧了,就可以提⾼效率。...,保证程序的效率 如以下情况,如果选择权交给程序员,万一不靠谱的程序员写成了inline函数,那展开后的指令数将超多,造成不可预料的结果 vs编译器debug版本下⾯默认是不展开inline的,这样

    35910

    【C++】基础入门(详解)

    在vs编译器中间接包含了,因此可以使用printf。...(实际底层实现上开辟了空间,是用一个指针指向其引用的变量) 通过调试可以知道:别名和引用的变量指向 共同占用一块空间。...反汇编观察 底层:a和b各自开了一块空间,b通过指针ptr指向了变量a 特性及使用 • 引用在定义时 必须初始化 • 支持多次引用 • 引用一个实体,其别名再不能引用其他实体...临时对象是编译器需要一个空间暂存表达式的求值结果时临时创建的一个未命名的对象。 与指针的关系 由上文可以发现引用与指针的部分功能是类似的,那为什么本贾尼还引入了引用这个语法呢?...因为inline被展开,就没有函数地址,链接时会出现报错(不能合成制表符)。 vs编译器 debug版本下面默认是不展开inline的,因此需要设置下。

    26000
    领券