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

【c++入门】引用详解 | auto类型推导 | 范围for循环 | nullptr空指针

☁️常引用 C++中,常引用是指在函数参数列表变量声明中使用const关键字来修饰引用。常引用作用是限制对被引用对象修改。...☁️传值与传引用效率比较 以值作为参数或者返回值类型,传参和返回期间,函数不会直接传递实参或者变量本身直接返回,而是传递实参或者返回变量一份临时拷贝,因此用值作为参数或者返回值类型,效率是非常低下...返回值是函数结果复制一份返回,而返回引用是返回原始数据引用。 通过上述代码比较,发现传值和指针作为传参以及返回值类型上效率相差很大。 返回值优点是简单、直观,不会对原始数据产生任何影响。...引用在定义时必须初始化,指针没有要求 引用初始化时引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向任何一个同类型实体 没有NULL引用,但有NULL指针 sizeof中含义不同:引用结果为引用类型大小...,给大家详细讲解 ️指针空值(nullptr) 良好C/C++编程习惯中,声明一个变量时最好给该变量一个合适初始值,否则可能会出现 不可预料错误,比如未初始指针

15710

CC++开发基础——指针引用

一,关于指针 1.指针基础概念 指针是可存储地址变量,存储指针地址可以是变量或者其他数据地址。 指针不仅仅是指向某地址,指针还关注指向该地址数据类型。...常量指针只能指向初始化时指定固定地址,此时虽然指针指向地址不可以被修改,但是地址存放变量值可以被修改。 此时指针常用来指向非const类型变量。...2.引用不能在中途被修改为指向别的变量,一旦引用初始化为某个变量别名,那么在这个引用生命周期内,一直引用变量引用指针使用,很多场景下减少了拷贝操作次数,增加了代码运行效率。...关于"&"位置,指针初始化时,"&"放在赋值语句右边;引用初始化时,"&"放在赋值语句左边。 引用可以和原始变量保持一样使用方式,不需要解引用。...因此,引用传参主要目的有: 为了调用函数时候,顺带修改原始变量值。 为了调用函数时候,减少变量副本生成。

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

智能指针探究

你可以使用 std::move 函数左值转换为右值引用。...::move 函数左值 x 转换为右值引用,并将其绑定到一个右值引用上。...需要注意是,使用 std::move 函数并不会移动对象释放资源。它只是左值转换为右值引用,以便可以使用移动构造函数移动赋值运算符来转移对象所有权。...当你使用std::move函数一个unique_ptr对象转化为右值引用并将其传递给另一个unique_ptr对象来初始化时,就会调用这个构造函数 unique_ptr& operator=(unique_ptr...当你使用std::move函数一个unique_ptr对象转化为右值引用并将其赋值给另一个unique_ptr对象来初始化时,就会调用这个运算符 第三行代码创建一个unique_ptr对象p1

6410

《C++Primer》第六章 函数

我们用传递给函数实参初始化形参对应自动对象,对于局部变量对应自动对象来说,分为两种情况:如果变量定义本身含有初始化值则用初始值进行初始化;如果变量本身不含初始值则进行默认初始化。...这意味着内置类型初始化局部变量产生未定义值。 局部静态对象 有时候需要令局部变量生命周期贯穿函数调用及之后时间,可以局部变量定义为static类型从而获得这样对象。...// matrix声明成指向含有10个整数数组指针 void print(int (*matrix)[10], int rowSize) {/*...*/} // 等价定义 void print(...不要返回局部对象引用指针 函数完成后,它所占用存储空间也随之被释放掉,这意味着函数终止后局部变量引用指向不再有效内存区域。 3....返回数组指针 因为数组不能拷贝,所以函数不能返回数组,不过可以返回数组指针引用

71110

【编程基础】C语言指针初始化和赋值

1、指针初始指针初始化时,“=”右操作数必须为内存中数据地址,不可以是变量,也不可以直接用整型地址值(但是int*p=0;除外,该语句表示指针为空)。...:一个具有0值整形常量表达式,或者此类表达式被强制转换为void *类型,则称为空指针常量,它可以用来初始赋给任何类型指针。...对指针进行初始化时常用有以下几种方式: 1.采用NULL指针常量,如:int *p = NULL; char *p = 2-2; float *p = 0; 2.取一个对象地址然后赋给一个指针...要注意是:对于一个不确定要指向何种类型指针定义它之后最好把它初始化为NULL,并在解引用这个指针时对它进行检验,防止解引用指针。...6、指向指针指针 指针初始第5种方式中提到了用一个指针地址来初始化一个指针。回忆一下上一讲内容:指针是一种变量,它也有自己地址,所以它本身也是可用指针指向对象。

2.6K80

C语言指针初始化和赋值

1、指针初始指针初始化时,“=”右操作数必须为内存中数据地址,不可以是变量,也不可以直接用整型地址值(但是int*p=0;除外,该语句表示指针为空)。...:一个具有0值整形常量表达式,或者此类表达式被强制转换为void *类型,则称为空指针常量,它可以用来初始赋给任何类型指针。...对指针进行初始化时常用有以下几种方式: 1.采用NULL指针常量,如:int *p = NULL; char *p = 2-2; float *p = 0; 2.取一个对象地址然后赋给一个指针...要注意是:对于一个不确定要指向何种类型指针定义它之后最好把它初始化为NULL,并在解引用这个指针时对它进行检验,防止解引用指针。...6、指向指针指针 指针初始第5种方式中提到了用一个指针地址来初始化一个指针。回忆一下上一讲内容:指针是一种变量,它也有自己地址,所以它本身也是可用指针指向对象。

2.3K10

第 13 章 拷贝控制

拷贝构造函数第一个参数类型必须是一个引用类型,因为如果不是引用类型,则在进行形参初始化时,会调用拷贝构造函数,这样就会导致无限循环。...直接初始化时,实际上是编译器使用普通函数匹配来选择与我们提供参数最匹配构造函数。而拷贝初始化是右侧运算对象拷贝到正在创建对象中,需要的话还会进行类型转换。...= "99"; // 先隐式类型转换,再拷贝初始化 拷贝初始以下情况中会发生 使用=定义变量 一个对象作为实参传递给一个非引用类型形参 从一个返回类型为非引用类型函数返回一个对象...右值引用指向将要被销毁对象,因此可以从绑定到右值引用对象“窃取”其状态,也就是移动其数据,而不用发生多余拷贝与析构操作。 变量是左值,因为变量是持久,直至离开作用域才被销毁。...可以通过标准库中 move函数来显式地一个左值转换为对应右值引用类型。在对一个对象使用 move函数后,可以对这个移后源对象进行销毁赋值操作,但不能再使用它!

97450

读完某C++神作,我只记下了100句话

定义函数体外内置变量自动初始化成0,定义函数体内内置变量不进行自动初始化,类类型(string)调用默认构造函数初始化。...全局变量加const作用域只本文件。再加extern可在整个程序访问。非const变量默认为extern。 引用初始化后始终绑定到初始对象,不能改变【引用本身不占存储单元】。...const对象,指针引用只能调用常量成员函数。 没有前缀成员都被假定为this调用。 默认构造函数按变量初始化规则初始化类中所有成员【内置类型作为局部变量时不初始化】。...友元:非公有成员访问权授予指定函数。friend类定义内部。友元引入类名和函数(定义声明)可以像预先声明一样使用。...对象不支持动态绑定,指针引用支持但使用起来麻烦,解决方法是定义包装类句柄类【提供到其它类接口类】。像使用指针一样使用句柄而不用管理它指向对象。类似智能指针方法建立指针句柄。

1.4K20

C++四种转换(const_cast、static_cast、dynamic_cast、reinterpreter_cast)

static_cast 相当于C语言中强制转换:(类型)表达式类型(表达式),用于各种隐式转换 非constconst、void*指针、int和char相互转换 用于基类和子类之间指针引用转换...,非指针直接报错 向上转化是安全,如果向下能(指针引用)成功但是不安全,结果未知; dynamic_cast 用于动态类型转换。...只能用于含有虚函数类,必须用在多态体系种,用于类层次间向上和向下转化。只能指针引用。向下转化时,如果是非法对于指针返回NULL,对于引用抛异常。...如果没有virtual方法进行下行转换(指针引用)会直接报错 const_cast 常量指针被转化成非常量指针,并且仍然指向原来对象; 常量引用被转换成非常量引用,并且仍然指向原来对象; const_cast...(重解释转换)几乎什么都可以,比如int指针,可能会出问题,尽量少用;随意转换编译都会通过,但是不安全转换运行时会异常 错误使用reinterpret_cast很容易导致程序不安全,只有转换后类型值转换回到其原始类型

3.4K10

Go 指针引用:值传递和址传递

值类型与指针类型 1.值类型 定义:变量直接指向存在内存中值,我们称之为值类型。 值类型变量值存储栈中。 值类型,一个变量赋值给另一个变量,称为值拷贝。...可理解为内存地址标签 取地址& 与解引用* 说明 go语言中我们可以通过 & 是取地址符号 , 即取得某个变量地址 , 如 ; &a * 是指针运算符 , 可以表示一个变量指针类型 , 也可以表示一个指针变量指向存储单元...variable传递进函数只是副本,他们都是variable副本上进行操作,并不影响 variable 原本值。...,但是引用值不能为NULL,并且引用在定义时候必须初始化; (5) 指针初始化后可以改变,即指向其它存储单元,而引用在进行初始化后就不会再改变了,从一而终。...总结2:值引用只是复制一个副本,不是指向内存地址引用指针引用指针指向内存地址引用,因此使用它操作不是结构体副本而是本身。

1.6K20

CC++开发基础——智能指针

智能指针除了像指针一样可以存储变量地址,还提供了其他功能,比如可以管理动态内存分配,对引用进行计数等。 当智能指针指向变量离开了作用域被重置时,智能指针会自动释放该变量所占用堆内存资源。...shared_ptr p3 = std::make_shared(15); std::unique_ptr p4 = std::make_unique(10); 智能指针初始化时...但是weak_ptr不提供指针引用操作,即无法调用"*""->"获得weak_ptr所指向变量。...由于一个初始化后unique_ptr独占了它所指向变量,因此unique_ptr不支持普通拷贝赋值操作。...std::move可以把一个智能指针所占有的资源转移给另一个智能指针。 shared_ptr包含一个显式构造函数,可用于右值unique_ptr转换为shared_ptr。

25120

JVM实战 - 对象实例化

Java是面向对象静态强类型语言,声明并创建对象代码很常见,根据某个类声明一个引用变量指向被创建对象,并使用此引用变量操作该对象 实例化对象过程中,JVM中发生了什么化学反应呢?...开始到本类路径上所有属性值都要分配内存 分配完毕之后,进行零值初始分配过程中,注意引用是占据存储空间,它是一个变量,占用4个字节 这个指令完毕后,指向实例对象引用变量压入虛拟机栈顶...● dup : 栈顶复制该引用变量,这时栈顶有两个指向堆内实例对象引用变量 如果方法有参数,还需要把参数压入操作栈中 两个引用变量目的不同,其中压至底下引用用于赋值,或者保存到局部变量表...,另一个栈顶引用变量作为句柄调用相关方法 ● invokespecial : 调用对象实例方法,通过栈顶引用变量调用方法 是类初始化时执行方法 是对象初始化时执行方法...垃圾收集器采用复制算法标记-整理算法,那么堆中空闲内存是完整区域,并且空闲内存和已使用内存之间由一个指针标记.

1.2K40

【c++入门】引用,内联函数,auto

你不能像指针那样先声明一个引用,然后再让它指向一个变量 int x = 5; int &b = x; // 正确,b被初始化为x引用 int &c; // 错误,引用必须在声明时被初始引用本质上是所引用变量别名...一旦引用初始化为某个变量引用,它就永远引用那个变量,不会像指针那样可以改变所指向变量。...通过引用参数,可以直接修改传入变量,而无需担心指针引用和地址操作,这使得代码更加安全、清晰 但是由于引用定义后不能改变指向引用不能替代指针 当然,这里swap函数取名字也可以取x,y,因为他们不同作用域...当 func 函数执行完毕后,局部变量 a 存储空间将被释放,此时返回给调用者引用指向一个已经被销毁对象。...,指针可以不初始引用不能改变指向指针可以 引用相对更安全,没有空引用,但是有空指针 sizeof中含义不同:引用结果为引用类型大小,但指针始终是地址空间所占字节个数(32位平台下占4个字节)

8810

【C++】特殊类设计 | 类型转换

,就定义了一个静态类类型指针 _p 而静态成员变量,需要在类外面初始化 ---- 定义静态成员变量时 创建对象 ---- 此时也可添加add增加和print打印功能 定义私有的string...定义一个静态锁,用于保护getinstallce函数中实例对象 ---- 初始化时,是不需要显示给值 ---- 每次获取对象都要加锁解锁,但实际上只需要保证第一次即可 ---- 这样写法依旧是不行...d p作为一个指针,i作为一个int类型变量,虽然都是4个字节,但是意义不同,所以不能互相,只能进行显式类型转换 即 int*类型指针强转为int类型 C++类型转换 隐式类型转化 存在精确度丢失问题...a值而不是内存中a值,所以a依旧为10 dynamic_cast C++独有的 dynamic_cast用于一个父类对象指针/引用换为子类对象指针引用(动态转换) 父类作为上 ,子类作为下...---- 向上转型:子类对象指针/引用->父类指针/引用(不需要转换,赋值兼容规则) ---- 父类对象是无法转换为子类对象 ---- 向下转型:父类对象指针/引用->子类指针/引用(用dynamic_cast

16430

C++primer学习笔记(三)

return;也只能用于返回值为void函数。 静态变量初次调用时初始化,static size_t ctr=0只执行一次。...const对象,指针引用只能调用常量成员函数。 没有前缀成员都被假定为this调用。 默认构造函数按变量初始化规则初始化类中所有成员【内置类型作为局部变量时不初始化】。...指向函数指针:函数类型由返回值和形参决定,与函数名无关。函数名本身就是指针。...fun==&fun Fcn pf=add pf(1,2)==(*pf)(1,2) 函数形参可以是指向函数指针:FUN( bool(string&, string&) ) FUN( bool...fstream 既要定义对象又要捆绑文件【open初始化时】。如果想用一个文件流对象读取多个文件,必须close()并clear()。所有流都可以用<<操作符。

54820

c++基础知识

,如果两个人写文件中出现同名变量函数,使用起来就有问题了。...[7]->    ->是C语言和C++语言一个运算符,叫做指向结构体成员运算符,用处是使用一个指向结构体对象指针访问其内成员。    ...一个指针当用来指向一个结构体、对象时,称之为结构体指针对象指针。结构体指针对象指针值是所指向结构体对象首地址。通过结构体指针对象指针即可访问该结构体对象。...,会抛出bad_cast异常 (3)其他null指针,转换成任何类型指针任何类型指针转换成void*类型指针。 ...也能从父类转向子类,但是如果转换父类指针(或者父类引用)所指向对象是完整,那么是没有问题;但是如果所指向对象并不完整,那么会出现runtime错误。

1.1K40

第 12 章 动态内存

weak_ptr,弱引用,不控制所指向对象生存期,指向 shared_ptr所管理对象。 默认初始 shared_ptr对象是一个空指针使用之前需要进行初始化。...使用已释放掉对象。通过释放内存后指针置为空,使用前检测指针是否为空,可以避免这种错误。 同一块内存被释放两次。 空悬指针指向一块曾经保存数据对象但现在已经无效内存指针。...因此,不能将一个内置指针隐式转换为一个智能指针,必须使用直接初始化形式来初始化一个普通指针。...// 内存永远都不会被释放 智能指针可以提供对动态分配内存安全而又方便管理,但这也需要坚持一些基本规范: 不使用相同内置指针初始化( reset)多个智能指针。...而对于大块内存分配时,内存分配和对象构造组合在一起,可能会造成不必要浪费(多次赋值,一次默认初始化时,一次使用时)。更重要是,如果一个类没有默认构造函数,就无法为其分配动态数组!

1.4K40

js中值类型和引用类型区别

因此,所有方法中定义变量都是放在栈内存中;栈中存储是基础变量以及一些对象引用变量,基础变量值是存储栈中,而引用变量存储栈中指向堆中数组或者对象地址,这就是为何修改引用类型总会影响到其他指向这个地址引用变量...2、保存与复制指向对象一个指针 3、使用instanceof检测数据类型 4、使用new()方法构造出对象是引用型 实例: // 值类型:Number、string、bollean、undefined...复制基本类型过程: 当从一个变量向另一个变量复制引用类型值时,同样也会将存储变量对象中值复制一份放到为新变量分配空间中。...不同是,这个值副本实际上是一个指针,而这个指针指向存储堆中一个对象。复制操作结束后,两个变量实际上引用同一个对象。因此,改变其中一个变量,就会影响另外一个变量:例 ?...var c = '' if(c){} // 把空字符串转换为false // 逻辑运算 console.log(10&&0); // 0 把10换成true console.log('' || 'abc

3.5K20

Javascript5种基本数据类型总结

1、Undefined类型 Undefined类型 只有一个值,即特殊undefined。使用var 声明但未对其加以初始化时,这个变量值就是undefined(默认获得)。...isNaN()接收到一个值之后,会尝试这个值转换为数值。某些不是数值值会直接转换为数值(如字符串“10”或者Boolean值)。...也就是说基本类型赋值操作后,两个变量是相互不受影响。 题目2是引用类型,当从一个变量向另一个变量赋值引用类型值时,同样也会将存储变量对象值复制一份放到为新变量分配空间中。...这时保存在变量是对象堆内存中地址,所以,与简单赋值不同,这个值副本实际上是一个指针,而这个指针指向存储堆内存一个对象。...因此,引用类型赋值其实是对象保存在栈区地址指针赋值,因此两个变量指向同一个对象,任何操作都会相互影响。 版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。

62530

C++基础知识

只能用于含有虚函数类,用于类层次间向上和向下转化、类之间交叉转换(cross cast)。只能指针引用。...4.reinterpret_cast 几乎什么都可以,比如 int 指针,执行是逐个比特复制操作。容易出问题,尽量少用。...C/C++中指针引用区别 指针 指针利用地址,它值直接指向存在电脑存储器中另一个地方值。由于通过地址能找到所需变量单元,可以说,地址指向变量单元。因此,地址形象化称为“指针”。...所以智能指针作用原理就是函数结束时自动释放内存空间,不需要手动释放内存空间。 对 shared_ptr 进行初始化时不能将一个普通指针直接赋值给智能指针,因为一个是指针,一个是类。...C 在编译时,每一个函数都有一个入口地址,该入口地址就是函数指针指向地址。有了指向函数指针变量后,可用该指针变量调用函数,就如同用指针变量引用其他类型变量一样,在这些概念上是大体一致

1.4K32
领券