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

在构造函数C++中初始化引用

在C++中,构造函数是一种特殊的成员函数,用于初始化对象的状态。在构造函数中初始化引用是一种常见的做法,因为引用是不能被重新绑定的,所以在构造函数中初始化引用可以确保引用在对象的整个生命周期中都指向正确的对象。

以下是一个示例代码,展示了如何在构造函数中初始化引用:

代码语言:c++
复制
class MyClass {
public:
    MyClass(int& ref) : myRef(ref) {}
private:
    int& myRef;
};

在这个示例中,MyClass的构造函数接受一个整数引用作为参数,并将其初始化给类的私有成员引用myRef。这样,在MyClass对象的整个生命周期中,myRef都会指向传递给构造函数的整数对象。

需要注意的是,在构造函数中初始化引用时,必须确保引用所绑定的对象具有足够的生命周期,以确保在整个对象生命周期中都是有效的。如果引用所绑定的对象在构造函数执行完毕后就被销毁了,那么引用就会变成悬空的引用,可能会导致程序出现未定义行为。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

C++构造函数初始化列表

构造函数的一项重要功能是对成员变量进行初始化,为了达到这个目的,可以构造函数函数对成员变量一一赋值,还可以采用初始化列表。...C++构造函数初始化列表使得代码更加简洁,请看下面的例子: #include using namespace std; class Student{..., 96); pstu -> show(); return 0; } 运行结果:小明的年龄是15,成绩是92.5李华的年龄是16,成绩是96 如本例所示,定义构造函数时并没有函数对成员变量一一赋值...成员变量的赋值顺序由它们的声明顺序决定, Demo 类,我们先声明的 m_a,再声明的 m_b,所以构造函数和下面的代码等价: Demo::Demo(int b): m_b(b), m_a...obj 栈上分配内存,成员变量的初始值是不确定的。 初始化 const 成员变量 构造函数初始化列表还有一个很重要的作用,那就是初始化 const 成员变量。

18740

C++构造函数初始化列表 ⑤ ( 匿名对象 生命周期 | 构造函数 不能调用 构造函数 )

传入的 参数 ; 类初始化时 , 根据定义顺序 , 先调用 成员变量的 构造函数 , 然后调用外部类构造函数 , 析构函数正好相反 ; 实例对象 的 const 成员变量 必须只能在 初始化列表 中进行...初始化 , 所有的构造函数都要进行初始化操作 ; 构造函数 不能调用 构造函数 ; 一、匿名对象 生命周期 1、匿名对象 生命周期 说明 调用 类名(构造函数参数) 创建的是 匿名对象 ; 匿名对象...二、构造函数 调用 构造函数 ---- 1、构造函数 不能调用 构造函数 构造函数 调用 构造函数 是危险行为 ; 构造函数 调用 构造函数 , 并不会为本对象进行初始化操作 ; 构造函数 的调用方式..., 天然就会创建一个 匿名对象 , 如果 没有变量 接收 这个 匿名对象 , 该匿名对象 本行表达式执行完毕后 , 就会被销毁 ; 2、代码示例 - 构造函数调用构造函数 下面的代码 , 先定义...执行 Student 的构造函数" << endl; } 然后 , 无参的 构造函数 , 调用 有参构造函数 ; // 构造函数 调用 构造函数 是危险行为 Student() { /

18120

C++构造函数初始化列表 ③ ( 构造函数初始化列表 为 const 成员变量初始化 )

构造函数初始化列表 总结 : 初始化列表 可以 为 类的 成员变量 提供初始值 ; 初始化列表 可以 调用 类的 成员变量 类型的 构造函数 进行成员变量初始化操作 ; 初始化列表 可以 使用 构造函数...传入的 参数 ; 类初始化时 , 根据定义顺序 , 先调用 成员变量的 构造函数 , 然后调用外部类构造函数 , 析构函数正好相反 ; 实例对象 的 const 成员变量 必须只能在 初始化列表 中进行...初始化 , 所有的构造函数都要进行初始化操作 ; 一、构造函数初始化列表 为 const 成员变量初始化 1、初始化 const 常量成员 如果 类 定义了 被 const 修饰 的 成员变量...========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ========== 在编译时 , 所有的 构造函数 上 , 都会报错 ; 所有的 构造函数 , 都必须 初始化列表..., 对 常量成员 进行初始化操作 ; 3、正确代码示例 - 初始化列表初始化常量成员 在下面的 类 B , 所有的 构造函数 , 都要使用 初始化列表 初始化 常量成员 , 只要遗漏一个构造函数

17530

C++构造函数初始化列表

构造函数初始化列表以一个冒号开始,接着是以逗号分隔的数据成员列表,每个数据成员后面跟一个放在括号初始化式。例如: ? 上面的例子两个构造函数的结果是一样的。...1.成员类型是没有默认构造函数的类。若没有提供显示初始化式,则编译器隐式使用成员类型的默认构造函数,若类没有默认构造函数,则编译器尝试使用默认构造函数将会失败。 2.const 成员或引用类型的成员。...1.内置数据类型,复合类型(指针,引用)- 成员初始化列表和构造函数体内进行,性能和结果上都是一样的 2.用户定义类型(类类型)- 结果上相同,但是性能上存在很大的差别。...因为类类型的数据成员对象进入函数体前已经构造完成,也就是说成员初始化列表处进行构造对象的工作,调用构造函数进入函数体之后,进行的是对已经构造好的类对象的赋值,又调用个拷贝赋值操作符才能完成(如果并未提供...初始化列表的成员初始化顺序: C++ 初始化类成员时,是按照声明的顺序初始化的,而不是按照出现在初始化列表的顺序。 ?

1.9K20

C++】类与对象(构造函数、析构函数、拷贝构造函数、常引用

今日更新了类与对象的构造函数、析构函数、拷贝构造函数、常引用的内容 欢迎大家关注点赞收藏⭐️留言 类的6个默认成员函数 如果一个类什么成员都没有,简称为空类。...构造函数是特殊的成员函数,需要注意的是,构造函数虽然名称叫构造,但是构造函数的主要任务并不是开空间创建对象,而是初始化对象。 特性 函数名与类名相同。 无返回值。...而d3是静态的局部对象,存储另一个单独的区域,main函数结束后析构,最终顺序就是2,1,3。 变式: 分析:func函数d3是局部的,d4是局部的静态。...类如果没有涉及资源申请时,拷贝构造函数是否写都可以;一旦涉及到资源申请 时,则拷贝构造函数是一定要写的,否则就是浅拷贝。 C++规定自定义的类型都会调用拷贝构造。...注意:拷贝构造时要传引用,不能传值。如果传值,根据C++规定,会调用拷贝构造,这样就会无穷递归下去,发生错误。

12910

C++构造函数意义 ( 构造函数显式调用与隐式调用 | 构造函数替代方案 - 初始化函数 | 初始化函数缺陷 | 默认构造函数 )

C++ 编译器默认提供 ; 默认构造函数 分为 2 种类型 : 默认无参构造函数 : 如果 类 没有定义 构造函数 , C++ 编译器 会默认提供一个 无参构造函数 , 该构造函数函数体为空...; 默认拷贝构造函数 : 如果 类 没有定义 拷贝构造函数 , C++ 编译器 会默认定义一个 默认拷贝构造函数 , 该函数的作用是进行简单的成员变量赋值 ; 6、代码示例 - 初始化函数无法及时调用...下面的代码 Student 类 , 定义了初始化 函数 : // 初始化函数 初始化 实例对象 void init(int _age, int _height) { m_age =..._age; m_height = _height; } 使用 Student s 代码定义实例对象的场景下 , 无法及时地调用 初始化函数 ; 代码示例 - 初始化函数 : #include "..., C++ 编译器 会提供一个 默认构造函数 // Student 类 没有提供拷贝构造函数 , C++ 编译器 会提供一个 默认拷贝构造函数 Student s; // 调用初始化函数 s.init

40420

C++构造函数 | 构造函数

C++对象的初始化 C++在建立一个对象时,常常需要作某些初始化,如果一个数据成员未被赋值,则它的值是不可预知的,因为系统为它分配内存时,保留了这些存储单元的原状,这就成为了这些数据成员的初始值,C...C++类的数据成员是不能在声明类时初始化的,如果一个类中所有的成员都是公用的,则可以定义对象时对数据成员进行初始化。...C++构造函数的作用 C++提供了构造函数来处理对象的初始化构造函数是一 种特殊的成员函数,与其他成员函数不同,不需要程序员来调用它,而是在建立对象时自动执行。...构造函数函数不仅可以对数据成员赋初值,而且可以包含其他语句。...如果用户自己没有定义构造函数,则C++编译系统会自动生成一个构造函数,只是这个构造函数函数体是空的,也没有参数,不执行初始化操作。

2.1K74

C++构造函数初始化列表 ④ ( 构造函数 和 析构函数 调用顺序分析 )

初始化 , 所有的构造函数都要进行初始化操作 ; 一、构造函数 和 析构函数 调用顺序 说明 1、构造函数调用顺序 一个类 C , 嵌套了 A 和 B 两个类类型的 对象 作为 成员变量 ; 构造函数的...和 B 构造函数 初始化列表 的顺序 , 与先调用谁的构造函数无关 ; 2、析构函数调用顺序 析构函数调用顺序 与 构造函数调用顺序相反 , 直接 将 构造函数 调用顺序 倒序排列即可 ; 3、...拷贝构造函数也可以定义初始化列表 如果一个类 没有定义 无参构造函数 , 只有一个 有参的构造函数 , 此时 , C++ 编译器 不会为其 生成 默认的无参构造函数 ; 这种场景下 涉及到了 构造函数...的类型 : 强制初始化列表调用构造函数 : 如果类定义了 有参构造函数 , 导致 无参构造函数 被屏蔽 , 那么 所有的构造函数初始化列表 , 都必须强制调用 子对象 的 构造函数 ;...不强制初始化列表调用构造函数 : 如果类定义了 无参构造函数 , 或者 有默认的 无参构造函数 , 那么 初始化列表 不强制调用 子对象 的构造函数 ; 使用如下方式 , 声明 A 和 B 类型的成员变量

23920

从零开始学C++构造函数与析构函数(二):初始化列表(const和引用成员)、拷贝构造函数

一、构造函数初始化列表 推荐构造函数初始化列表中进行初始化 构造函数的执行分为两个阶段 初始化段 普通计算段 (一)、对象成员及其初始化 #include  using namespace...再提一点,如果类是继承而来,基类没有默认构造函数的时候,基类的构造函数要在派生类构造函数初始化列表调用。...因为const 变量或者引用都得定义的时候初始化,所以const 成员和引用成员必须在初始化列表初始化。另外,可以使用定义枚举类型来得到类作用域共有的常量。...因为局部对象离开建立它的函数时就消亡了,不可能在返回调用函数后继续生存,所以处理这种情况时,编译系统会在调用函数的表达式创建一个无名临时对象,该临时对象的生存周期只函数调用处的表达式。...函数传参和返回都没有调用构造函数,t2 是引用故也不会调用拷贝构造函数。 参考: C++ primer 第四版 Effective C++ 3rd C++编程规范

1.3K00

C++构造函数初始化列表 ① ( 类对象作为成员变量时的构造函数问题 | 构造函数初始化列表语法规则 )

; 此时使用 默认无参构造函数 初始化 B , 就会报错 ; 一个类 , 其成员变量是 带有参构造函数 的类型 , 这种情况下没有调用 有参构造函数的机会 , 此时就会出现 编译报错情况 ; 在下面的代码...就是 C++ 构造函数 初始化列表 ; 2、错误代码示例 代码示例 : #include "iostream" using namespace std; class A { public: /...========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ========== 二、构造函数初始化列表 ---- 1、构造函数初始化列表语法规则 C++ 语言中 , 构造函数初始化列表...(成员变量值) , 成员变量名称(成员变量值) { // 构造函数内容 } 构造函数初始化列表 位置 构造函数 的 参数列表之后 , 冒号 : 与花括号 {} 之间 ; 使用 逗号 , 分隔 ;...初始化列表的元素由 成员变量的名称 和 初始值组成 , 使用等号 = 连接 ; 在下面的代码 , 为 B 类定义了默认的构造函数 , 其中定义了 构造函数 初始化列表 ; 初始化列表 , m_age

47430

C++构造函数初始化列表 ② ( 构造函数初始化列表 传递参数 | 类嵌套情况下 的 构造函数 析构函数 执行顺序 )

一、构造函数初始化列表 传递参数 1、构造函数参数传递 构造函数 初始化列表 还可以使用 构造函数 的参数 ; 借助 构造函数 的参数列表 , 可以为 初始化列表 传递参数 ; 在下面的代码..., B 类的 有参构造函数 , 传入了 3 个参数 , 这三个参数都不在函数体中使用 , 而是 参数列表中使用 , // 构造函数的参数可以作为 B(int age, int ageOfA,..., 类 A 定义了 2 个参数的 有参构造函数 ; 类 B 定义了 无参构造函数 , 但是该 无参构造函数 , 定义了函数列表 B() : m_age(10), m_a(10, 150) , 函数列表.../ 析构函数 执行顺序 ---- 1、构造函数 / 析构函数 执行顺序 类 B 定义了 A 类型 的 成员变量 ; A 类型对象 是 被组合对象 ; 构造函数执行顺序 : 初始化 B 类型 实例对象时...: 析构函数构造函数 的执行顺序 相反 ; 2、代码示例 - 构造函数执行顺序 下面的代码 , B 类定义 A 类型 成员变量 ; 执行构造函数时 , 先调用 A 的构造函数 , 再调用

19530

C++】多态 ⑨ ( vptr 指针初始化问题 | 构造函数 调用 虚函数 - 没有多态效果 )

, 则 没有 多态效果 ; 一、vptr 指针初始化问题 1、vptr 指针与虚函数表 " 虚函数表 " 由 C++ 编译器 负责 创建 与 维护 , 被 virtual 关键字 修饰的 虚函数 ,...会自动 被 C++ 编译器 存储到 " 虚函数表 " , 类中会自动添加一个 " vptr 指针 " 成员变量 指向 虚函数表 ; 2、vptr 指针初始化时机 对象的 vptr 指针 指向 虚函数表..., 对象 被 创建时 , 由 C++ 编译器 对 对象的 vptr 指针进行初始化操作 , 对象 创建完成 后 , 也就是 虚函数 整理完毕 , 全部放到 虚函数后 , vptr 指针 才会指向... 调用 虚函数 , 则 没有 多态效果 ; 父类 的 构造函数 , 调用了 父类的 虚函数 ; 此时 , 如果 创建 子类对象 , 执行 父类构造函数 , 仍然调用 父类 的虚函数 , 子类的虚函数...没有被调用 , 说明 构造函数 执行期间 , 多态没有生效 ; 参考 【C++】继承 ⑧ ( 继承 + 组合 模式的类对象 构造函数 和 析构函数 调用规则 ) 博客构造函数 调用规则 : 构造函数

21720

C++构造函数的作用_c++什么是构造函数

所以看完这个博客不要就记住了构造函数的赋值作用,他还有其他很多的作用。 首先从本质上理解构造函数 C++ 程序,变量定义时可以初始化。如果不进行初始化,变量的初始值会是什么呢?...未初始化的局部变量 对于局部变量,如果不进行初始化,那么它的初始值是随机的。局部变量定义函数内部,其存储空间是动态分配在栈的。...C++,有一种特殊的成员函数,它的名字和类名相同,没有返回值,不需要用户显式调用(用户也不能调用),而是创建对象时自动执行。这种特殊的成员函数就是构造函数(Constructor)。...C++语言中,“构造函数”就是一类特殊的成员函数,其名字和类的名字一样,并且不写返回值类型(void 也不写)。 构造函数可以被重载,即一个类可以有多个构造函数。...示例1,Student 类已经有了一个构造函数Student(char *, int, float),也就是我们自己定义的,编译器不会再额外添加构造函数Student(),示例2我们才手动添加了该构造函数

1.4K20

【Kotlin】类的初始化 ② ( 主构造函数 | 主构造函数定义临时变量 | 主构造函数定义成员属性 | 次构造函数 | 构造函数默认参数 )

文章目录 一、主构造函数定义临时变量 二、主构造函数定义成员属性 三、次构造函数 四、构造函数默认参数 一、主构造函数定义临时变量 ---- Kotlin 类 , 可以 类声明 时 类名后...定义 " 主构造函数 " ; 构造函数 , 可以 定义 成员属性 , 并为 成员属性 提供 初始值 ; 构造函数 , 可以定义 临时变量 , 临时变量 一般使用 以下划线为开头 的名称...---- 构造函数 定义临时变量 , 格式为 : class 类名(_临时变量名: 临时变量类型){} 构造函数也可以 定义成员属性 , 格式为 : class 类名(var 成员属性名:...---- Kotlin 类只允许 定义类时 定义 一个主构造函数 , 在其中可以定义 临时变量 , 也可以定义 属性变量 ; 次构造函数 定义 Kotlin 内部 , 可以定义 多个 次构造函数..., 可以不为其传递 值参 , 构造函数跳过该参数 , 其 后面的参数需要使用 参数名 = 参数值 进行赋值 ; 代码示例 : class Hello( // 主构造函数, 直接在主构造函数定义属性

4.7K20

C++拷贝构造函数

拷贝构造函数,是一种特殊的构造函数,它由编译器调用来完成一些基于同一类的其他对象的构建及初始化。其唯一的参数(对象的引用)是不可变的(const类型)。...调用拷贝构造函数的情形 C++,下面三种对象需要调用拷贝构造函数(有时也称“复制构造函数”): 1) 一个对象作为函数参数,以值传递的方式传入函数体; 2) 一个对象作为函数返回值,以值传递的方式从函数返回...拷贝构造函数必须以引用的形式传递(参数为引用值)。其原因如下:当一个对象以传递值的方式传一个函数的时候,拷贝构造函数自动的被调用来生成函数的对象。...上面的语句中,如果类定义了拷贝构造函数,在对象复制初始化时,调用的将是拷贝构造函数,而不是缺省构造函数拷贝构造函数,可以根据传入的变量,复制指针所指向的资源。...可见,拷贝构造函数是一种特殊的构造函数函数的名称必须和类名称一致,它必须的一个参数是本类型的一个引用变量。 二. 拷贝构造函数的调用时机 C++,下面三种对象需要调用拷贝构造函数

1.9K80

C++构造函数语义(合成默认构造函数)

初学C++的时候,对于一个对象来说,如果我们没有去定义其默认构造函数,那么编译器就会为我们自动生成一个默认构造函数。...但其实是不准确的,具体来说是编译器会在必要的时候来生成一个默认构造函数,那么这个编译器生成的默认构造函数称为合成默认构造函数。那么以下四种情况编译器才会生成一个合成默认构造函数: 1....一个类没有任何构造函数,但是包含了一个其他类的对象成员,并且该对象成员有默认构造函数,此时编译器就会为该类生成一个合成默认构造函数,用来调用对象成员的默认构造函数。 2....基类带有默认构造函数的派生类。        是指当一个基类包含一个默认构造函数,但是派生类没有任何构造函数时,编译器会生成一个合成构造函数,作用是调用基类的默认构造函数。 3....此外,如果自己定义了默认构造函数,那么编译器也会根据需要来扩充默认构造函数,目的就是上述所说的,调用父类的默认构造函数或者给对象的虚函数表指针赋值。 4.

1.3K20

C++构造函数体内赋值与初始化列表的区别

1.C++构造函数初始化列表处提示出现 error: expected ‘{’ before ‘this’ 问题描述下: Linux环境运行,使用g++编译,贴上如下代码出错处已标注于代码。...得知网友点拨后,才知道其原因是类对象完成初始化之前,类对象还未成形,不能使用this指针。以上问题的解决方案就是去掉this。...---- 2.初始化列表不能使用this,那构造函数体内是否可以使用this呢?...答案是,当然可以,因为构造函数对成员数据的初始化初始化列表完成的,构造函数体内对数据成员所做的工作仅仅是赋值操作,在此之前,类成员数据已经完成了初始化工作,是由其默认构造函数完成的。...所以,这也是编程原则尽量使用初始化列表的原因。

84820

C++构造函数

这就引出了构造函数构造函数 C++提供了构造函数来处理对象的初始化构造函数是一种特殊的成员函数,与其他成员函数不同,不需要用户来调用它,而是在建立对象时自动执行。...如果用户自己没有定义构造函数,则C++系统会自动生成一个构造函数,只是这个构造函数函数体是空的,也没有参数,不执行初始化操作。...形式 构造函数根据参数的情况,可以分成不带参数的默认构造函数、带参数的构造函数和传引用构造函数,还有一种参数初始化列表的形式,下面我们一一来看。...y=y_value; } 参数初始化列表式不带参数的默认构造函数 我们类声明的时候和不带参数的默认构造函数是一样的: class Point { double x,y; public: Point...传引用构造函数实际上是拷贝构造函数,里面涉及深拷贝和浅拷贝,我们下期再聊这个。

13430
领券