首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C++_ ‘&‘ 引用详解

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

1.1K40

【C++修炼之路】1. 初窥门径

4.3 C++支持函数重载的原理–名字修饰 为什么C++支持函数重载,而C语言不支持函数重载呢? 在C/C++中,一个程序要运行起来,需要经历以下几个阶段:预处理、编译、汇编、链接。...5.7 引用和指针的区别 在语法概念上引用就是一个别名,没有独立空间,和其引用实体共用同一块空间。...引用和指针的不同点: 引用概念上定义一个变量的别名指针存储一个变量地址。...引用在定义时必须初始化,指针没有要求 引用在初始化时引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向任何一个同类型实体 没有NULL引用,但有NULL指针 在sizeof中含义不同:引用结果为引用类型的大小...不能推导的场景 auto不能作为函数的参数 // 此处代码编译失败,auto不能作为形参类型,因为编译器无法对a的实际类型进行推导 void TestAuto(auto a) {} auto不能直接用来声明数组

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

C++打怪升级(二)- 引用详解

---- 引用是什么 概念 引用reference是为已经存在的变量取另外一个名字,是该变量的别名。 在C++语法角度:编译器不会为引用变量开辟内存空间,它和所引用的变量共用同一块内存空间。...可以认为是变量n创建了一个匿名临时引用变量,该匿名引用变量是变量n的引用,即n的别名,并作为真正的返回值返回到main函数栈帧里,main函数内部引用遍历ret接受,即ret是匿名临时变量的别名,而匿名临时变量又是变量...引用概念上定义一个变量的别名指针存储一个变量地址; 2. 引用在定义时必须初始化,指针没有要求; 3....引用在初始化时引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向任何 一个同类型实体; 4. 没有NULL引用,但有NULL指针; 5....引用自加即引用的实体增加1,指针自加即指针向后偏移一个类型的大小; 7. 有多级指针,但是没有多级引用; 8. 访问实体方式不同,指针需要显式解引用,引用编译器自己处理; 9.

32720

【C++】引用与内联

引用 2.1 引用概念 引用不是新定义一个变量,而是给已存在变量取了一个别名编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。...销毁栈帧,vs不清理空间,会给一个临时变量,如果临时变量比较小,通常使用寄存器充当。...,但是不能完全替代指针 引用不能完全替代指针原因:引用定义后,不能改变指向 就像在链表中删除一个节点 在语法概念上引用就是一个别名,没有独立空间,和其引用实体共用同一块空间。...引用概念上定义一个变量的别名指针存储一个变量地址。...vs2022的设置方式) 3.2 特性 inline是一种以空间换时间的做法,如果编译器将函数当成内联函数处理,在编译阶段,会用函数体替换函数调用,缺陷:可能会使目标文件变大,优势:少了调用开销,提高程序运行效率

8510

C++进阶之路:何为引用、内联函数、auto与指针空值nullptr关键字

C++中的引用 引用概念 引用不是新定义一个变量,而是给已存在变量取了一个别名编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。...引用和指针的区别 在语法概念上 引用就是一个别名,没有独立空间,和其引用实体共用同一块空间。...底层汇编语言里 引用与指针是一样的 都是指针 引用与指针的不同点 引用概念上定义一个变量的别名指针存储一个变量地址。...引用在定义时必须初始化,指针没有要求 引用在初始化时引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向任何一个同类型实体 没有NULL引用,但有NULL指针 在sizeof中含义不同:...,以下给出vs2013的设置方式) 调完设置后: 内联函数的特性 1.inline是一种以空间换时间的做法,如果编译器将函数当成内联函数处理,在编译阶段,会用函数体替换函数调用 缺陷:可能会使目标文件变大

10910

C++11新特性学习笔记

使用constexpr,你可以创建一个编译时的函数: constexpr函数的限制: 函数中只能有一个return语句(有极少特例) 函数必须返回值(不能是void函数) 在使用前必须已有定义 return...返回语句表达式中不能使用非常量表达式的函数、全局数据,且必须是一个常量表达式 常量表达式的构造函数有以下限制: 函数体必须为空 初始化列表只能由常量表达式来赋值 3.7 用户定义字面量(vs2013...std::function 在C++中,可调用实体主要包括:函数函数指针函数引用、可以隐式转换为函数指定的对象,或者实现了opetator()的对象。...C++11中,新增加了一个std::function类模板,它是对C++中现有的可调用实体的一种类型安全的包裹。...(111) ->: 111 ​ operator()(222) ->: 222 */ return 0; } std::function对象最大的用处就是在实现函数回调,使用者需要注意,它不能被用来检查相等或者不相等

2.2K20

UNIX(多线程):14---理解线程构造函数

第一参数的类型并不是c语言中的函数指针(c语言传递函数都是使用函数指针),在c++11中,增加了可调用对象(Callable Objects)的概念,总的来说,可调用对象可以是以下几种情况: 函数指针...重载了operator()运算符的类对象,即仿函数 lambda表达式(匿名函数std::function 函数指针示例 // 普通函数 无参 void function_1() { } //...而t2之所以编译错误,是因为编译器并没有将Fctor()解释为一个临时对象,而是将其解释为一个函数声明,编译器认为你声明了一个函数,这个函数不接受参数,同时返回一个Factor对象。...:endl; return 0; } // vs下:最终是:"hello" // g++编译器:编译报错 事实上,该代码使用g++编译会报错,而使用vs2015并不会报错,但是子线程并没有成功改变外面的变量...如下面修改后的代码: std::thread t1(f, std::ref(m)); 然后vs和g++都可以成功编译,而且子线程可以修改外部变量的值。

58020

C++11新特性学习笔记

使用constexpr,你可以创建一个编译时的函数: constexpr函数的限制: 函数中只能有一个return语句(有极少特例) 函数必须返回值(不能是void函数) 在使用前必须已有定义 return...返回语句表达式中不能使用非常量表达式的函数、全局数据,且必须是一个常量表达式 常量表达式的构造函数有以下限制: 函数体必须为空 初始化列表只能由常量表达式来赋值 3.7 用户定义字面量(vs2013...std::function 在C++中,可调用实体主要包括:函数函数指针函数引用、可以隐式转换为函数指定的对象,或者实现了opetator()的对象。...C++11中,新增加了一个std::function类模板,它是对C++中现有的可调用实体的一种类型安全的包裹。...(111) ->: 111 ​ operator()(222) ->: 222 */ return 0; } std::function对象最大的用处就是在实现函数回调,使用者需要注意,它不能被用来检查相等或者不相等

2K20

你该知道的C++四种显式类型转换

,也与编译器的属性设置有关.所以不能完全使用C语言的强制转换替代,它也是最常有用的,最不可缺少的一种强制转换....这个检查主要来自虚函数(virtual function) 在C++的面对对象思想中,虚函数起到了很关键的作用,当一个类中拥有至少一个函数,那么编译器就会构建出一个函数表(virtual method...table)来指示这些函数的地址,假如继承该类的子类定义并实现了一个同名并具有同样函数签名(function siguature)的方法重写了基类中的方法,那么虚函数表会将该函数指向新的地址。...a pointer to a function of a different type (从指向函数指针转向另一个不同类型的指向函数指针) A pointer to an object to a...types (从一个指向成员的指针转向另一个指向类成员的指针

1.8K20

C++:33---类成员指针

如果没有这对括号,编译器将认为该声明是一个(无效的)函数声明: 错误的原因:编译器会认为p是一个普通函数,并且返回Screen类的一个char成员。...因为成员指针不是可调用对象,所以我们不能直接将一个指向成员函数指针传递给算法 例如,下面在一个vector中寻找第一个空的string: std::vector svec;auto...,而非函数 ①使用function生成一个可调用对象 function模板: 从指向成员函数指针获取可调用对象的一种方法是使用function模板。...我们也可以采取另一种方法,就是使用标准库功能mem_fn来让编译器负责推断成员的类型 mem_fn也定义在functional头文件中,并且可以从成员指针生成一个可调用对象 和function不同的是:...mem_fn可以根据成员指针的类型推断可调用对象的类型,而无须用户显式地指定 例如:我们使用mem_fn生成一个可调用对象,该对象接受一个string实参,返回一个bool值(编译器自动推断的) std

82030

C++:C++入门基础

windows下vs编译器对函数名字修饰规则相对复杂难懂 C/C++ 函数调用约定___declspec(dllexport) void test2();-CSDN博客 思考:如果两个函数函数名和参数是一样的...引用一旦引用一个实体,再不能引用其他实体 就是只能给一个变量当别名不能给多个变量当别名 9.3 常引用 指针和引用,赋值/初始化权限可以缩小或者平移,但是不能放大 9.4 使用场景 1....9.6 引用和指针的区别 在语法概念上引用就是一个别名,没有独立空间,和其引用实体共用同一块空间。...引用概念上定义一个变量的别名指针存储一个变量地址。 2. 引用在定义时必须初始化,指针没有要求 3....引用比指针使用起来相对更安全(因为引用必须初始化,而指针不用,没有空引用,但是有空指针) 10.在有些需要用二级指针的场景,较难理解,用引用就可以简化一点 十、内联函数 为什么要有内联函数呢??

15710

C++从入门到精通——auto的使用

聪明的同学可能已经想到:可以通过typedef给类型取别名,比如: #include #include typedef std::map<std::string, std:...const pstring* p2;表示p2是一个指向pstring类型的常量指针。即,p2是一个指针变量,它指向的是pstring类型的常量。...由于pstring是char*的别名,因此这里p2是一个指向char*类型的常量指针。 现在来看char const *p1,这是C++中另一种定义常量指针的方式。...C++11中,标准委员会赋予了auto全新的含义即:auto不再是一个存储类型指示符,而是作为一个新的类型指示符来指示编译器,auto声明的变量必须由编译器在编译时期推导而得。...不能推导的场景 auto不能作为函数的参数 // 此处代码编译失败,auto不能作为形参类型,因为编译器无法对a的实际类型进行推导 void TestAuto(auto a) {} auto不能直接用来声明数组

15310

C++心决之命名空间、重载函数和引用

5.2 C++支持函数重载的原理--名字修饰(name Mangling) 为什么 C++ 支持函数重载,而 C 语言不支持函数重载呢?...引用一旦引用一个实体,再不能引用其他实体 6.3 常引用 void TestConstRef() { const int a = 10; //int& ra = a; // 该语句编译时会出错...传值和指针在作为传参以及返回值类型上效率相差很大 6.6 引用和指针的区别 在 语法概念上 引用就是一个别名,没有独立空间,和其引用实体共用同一块空间。...在 底层实现上 实际是有空间的,因为 引用是按照指针方式来实现 的 引用和指针的不同点 : 1. 引用概念上定义一个变量的别名指针存储一个变量地址。 2....引用 在定义时 必须初始化 ,指针没有要求 3. 引用 在初始化时引用一个实体后,就 不能再引用其他实体 ,而指针可以在任何时候指向任何 一个同类型实体 4.

8810

C++基础知识复习

3.同一内存空间可以取多个别名 (当我们使用一些引用语法的时候,无需关心编译器背后是如何作用的,但当我们分析奇怪语法现象的时候,我们才会关系C++编译器是怎么去做的) pointer reference...constant reference const Type& name; 只能通过这个别名读这个变量的值,不能去修改它。...不能通过类名访问静态数据成员 static class function members 类的静态成员函数。 例如上面静态成员计算一个数量。 直接用类调用他的函数即可。...或者 在类构造函数的初始化列表赋值。 在构造函数中初始化。 const class function member const修饰的成员函数不能修改任何数据成员。...编译器中把子类自己的虚函数放到了第一个父类的虚函数表最后 同样通过指针访问对应的虚函数表内容 Son son; cout << (int*)&son << endl; //第一个函数指针 int*

51910

C++11常用的一部分新特性

左值是一个表示数据的表达式(如变量名或解引用的指针),我们可以获取它的地址+可以对它赋值,左值可以出现赋值符号的左边,右值不能出现在赋值符号左边。...右值也是一个表示数据的表达式,如:字面常量、表达式返回值,函数返回值(这个不能是左值引用返回)等等,右值可以出现在赋值符号的右边,但是不能出现出现在赋值符号的左边,右值不能取地址。...如果你没有自己实现移动赋值重载函数,且没有实现析构函数 、拷贝构造、拷贝赋值重载中的任意一个,那么编译器会自动生成一个默认移动赋值。...lambda表达式 为什么要有lambda表达式 这个和仿函数有些类似。...<< f3(1, 2) << endl; /*function f4(Functor());//这里不可以,因为编译器会识别成为函数指针 cout << f4(1, 2

365110

【C++】C++入门必备知识详细讲解

引用的概念 引用不是新定义一个变量,而是给已存在变量取了一个别名编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。...我们一一分析: 引用和指针的不同点: 引用概念上定义一个变量的别名指针存储一个变量地址。...引用在定义时必须初始化,指针没有要求 引用在初始化时引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向任何 一个同类型实体 没有NULL引用,但有NULL指针 在sizeof中含义不同:引用结果为引用类型的大小...,但指针始终是地址空间所占字节个数(32 位平台下占4个字节) 引用自加即引用的实体增加1,指针自加即指针向后偏移一个类型的大小 有多级指针,但是没有多级引用 访问实体方式不同,指针需要显式解引用,引用编译器自己处理...,如下图: 这是因为什么呢?

9310

Modern c++快速浅析

;同时由于是编译器自动推导,各种类型忽略问题以及转换问题我们都需要重视以std::vector为例,std::vector是std::vector的一个特化版本,容器中的bool...>>; //两种方法等效 使用using会令代码的可读性更高一些,以函数指针为例 // 令MyFunc...,那么代表构造出来的对象可以是一个编译期常量 以修饰函数为例,函数是否的返回值是否满足constexpr取决于两个方面 •传入的参数是否是编译期常量•函数体内的计算是否是编译期能够处理的 当两者条件都能满足时...若lambda表达式的生命周期比this指针更长,那么就会发生对野指针的访问 std::function funcObj; struct My_Struct { int data...那么我们可以认为这个Lambda所生成的匿名类中,含有一个char类型和一个指针类型(this指针),由于内存对齐的缘故,这个Lambda类型的大小是8个字节 // 假设这是编译器生成的匿名类 class

14310
领券