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

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

一、构造函数 为 初始化列表 传递参数 1、构造函数参数传递 构造函数 初始化列表 还可以使用 构造函数参数 ; 借助 构造函数参数列表 , 可以为 初始化列表 传递参数 ; 在下面的代码中..., 传入参数即可 ; // 通过 B 有参构造函数 // 其中 构造函数参数 作为 参数列表 中参数值 B b(10, 10, 150); 2、代码示例 - 构造函数参数传递 下面的代码中...int m_age; // 年龄 A m_a; // A 类型成员变量 }; int main() { // 通过 B 有参构造函数 // 其中 构造函数参数 作为 参数列表 中参数值...: 析构函数构造函数 执行顺序 相反 ; 2、代码示例 - 构造函数执行顺序 下面的代码中 , 在 B 类中定义 A 类型 成员变量 ; 执行构造函数时 , 先调用 A 构造函数 , 再调用...; // A 类型成员变量 }; int main() { // 通过 B 有参构造函数 // 其中 构造函数参数 作为 参数列表 中参数值 B b(10, 10, 150);

20330

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

一、类对象作为成员变量构造函数问题 1、问题描述 如果 一个类 A 对象 作为 另外一个类 B 成员变量时 , 在以下场景会报错 : 为类 A 定义 有参 构造函数 , 那么 A 无参默认构造函数就失效了...就是 C++ 构造函数 初始化列表 ; 2、错误代码示例 代码示例 : #include "iostream" using namespace std; class A { public: /...========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ========== 二、构造函数初始化列表 ---- 1、构造函数初始化列表语法规则 在 C++ 语言中 , 构造函数初始化列表...是一种用于初始化类成员变量方法 ; 构造函数初始化列表 可实现功能 : 为成员变量提供初始值 调用其他 成员变量 构造函数 来初始化成员变量 构造函数初始化列表语法规则 : 构造函数() : 成员变量名称...(成员变量值) , 成员变量名称(成员变量值) { // 构造函数内容 } 构造函数初始化列表 位置在 构造函数 参数列表之后 , 冒号 : 与花括号 {} 之间 ; 使用 逗号 , 分隔 ;

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

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

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

18630

C++临时变量常量性

出错原因是编译器根据字符串"hello world"构造一个string类型临时对象,这个临时变量具有const属性,当这个临时变量传递给非conststring&引用类型时,无法隐式完成const...2.临时变量常量性原因 为什么临时对象作为引用参数传递时,形参必须是常量引用呢?很多人对此解释是临时变量是常量,不允许赋值改动,所以作为非常量引用传递时,编译器就会报错。...IntClass(6)表示生成一个无名临时变量并作为左值被修改,所以临时变量并不是常量,只是编译器从语义层面限制了临时变量传递给非const引用。...但如果把一个临时变量当作非const引用参数进来,由于临时变量特殊性,临时变量所在表达式执行结束后,临时变量就会被释放,所以,一般说来, 修改一个临时变量是毫无意义,据此,C++编译器加入了临时变量不能作为非...---- 参考文献 [1]c++中临时变量不能作为非const引用参数 [2]C++编程思想[M].刘宗田译.8.3.2.1临时量

1.9K31

C++抛出异常与传递参数区别

相同点就是传递参数和传递异常都可以是值、引用或指针。 (1)区别一:C++标准要求被作为异常抛出对象必须被拷贝复制。考察如下程序。...: 0025FA20 0025FA20 5 c 0025F950 在执行输入操作是,实参localStuff是以引用方式进入函数operator>>,形参变量w接收是localStuff地址,任何对...这是因为localStuff通过拷贝构造函数传递给异常对象,而异常对象又通过拷贝构造函数传递给catch子句中对象w。...并且调用拷贝构造函数是属于被抛出对象静态类型。当通过值方式捕获时,对象被拷贝了两次。...对象作为引用参数传递给函数时,不需要进行额外拷贝; 第二,对象作为异常被抛出与作为参数传递给函数相比,前者允许类型转换比后者要少(前者只有两种类型转换形式); 第三,catch子句进行异常类型匹配顺序是它们在源代码中出现顺序

1.6K20

C++抛出异常与传递参数区别

抛出异常与传递参数区别 从语法上看,C++异常处理机制中,在catch子句中申明参数与在函数里声明参数几乎没有什么差别。例如,定义了一个名为stuff类,那么可以有如下函数申明。...相同点就是传递参数和传递异常都可以是值、引用或指针。 下面考察二者不同点。 (1)区别一:C++标准要求被作为异常抛出对象必须被拷贝复制。 考察如下程序。...这是因为localStuff通过拷贝构造函数传递给异常对象,而异常对象又通过拷贝构造函数传递给catch字句中对象w。...并且调用拷贝构造函数是属于被抛出对象静态类型。当通过值方式捕获时,对象被拷贝了两次。...对象作为引用参数传递给函数时,不需要进行额外拷贝; 第二,对象作为异常被抛出与作为参数传递给函数相比,前者允许类型转换比后者要少(前者只有两种类型转换形式); 第三,catch子句进行异常类型匹配顺序是它们在源代码中出现顺序

1.8K30

C++】拷贝构造函数和赋值运算符重载详解

C++中,拷贝构造函数通常用于将一个对象值复制到另一个对象中(一个对象存在,一个对象不存在),以便在程序中进行对象赋值和传递操作时,能够确保对象内容被正确复制。...⭐特征 拷贝构造函数也是特殊成员函数,其特征如下: 拷贝构造函数构造函数一个重载形式。...(C++规定自定义类型参时都会调用它拷贝构造,因为参时,形参相当于一份拷贝,如果拷贝构造函数也是用形式写,那么它会继续寻找真正拷贝构造函数,造成无穷递归) 后果: 若显式定义...++: // 前置++和后置++都是一元运算符,为了让前置++与后置++形成能正确重载 // C++规定:后置++重载时多增加一个int类型参数,但调用函数时该参数不用传递,编译器 //自动传递...注意:this指向对象函数结束后不会销毁,故以引用方式返回提高效率 后置++: 前置++和后置++都是一元运算符,为了让前置++与后置++形成能正确重载,C++规定:后置++重载时多增加一个

15910

C++初阶路】--- 类和对象(中)

C++中通过引入this指针解决该问题,即:C++编译器给每个“非静态成员函数“增加了一个隐藏指针参数,让该指针指向当前对象(函数运行时调用该函数对象),在函数体中所有“成员变量操作,都是通过该指针去访问...问题二处程序也是正常运行,同样道理成员函数不存在对象中,所以虽然写成(*p).,但是任不需要解引用。从汇编角度,两者是完全相同! p->作用是将p地址作为形参传递给成员函数,即this指针。...只能在“成员函数内部使用 this指针本质上是“成员函数形参,当对象调用成员函数时,将对象地址作为实参传递给this形参。所以对象中不存储this指针。...this指针是“成员函数”第一个隐含指针形参,一般情况由编译器通过ecx寄存器自动传递,不需要用户。 1.3....warning C4930: “Date d3(void)”: 调用原型函数(是否是有意用变量定义?)

10310

C++如何禁止函数值调用

代码编译运行环境:VS2017+Debug+Win32 ---- 按照参数形式不同,C++应该有三种函数调用方式:值调用、引用调用和指针调用。...对于基本数据类型变量作为实参进行参数传递时,采用值调用与引用调用和指针调用效率相差不大。但是,对于类类型来说,值调用和引用调用之间区别很大,类对象尺寸越大,这种差别越大。...值调用与后面两者区别在于值调用在进入函数体之前,会在栈上建立一个实参副本,而引用和指针调用没有这个动作。建立副本操作是利用拷贝构造函数进行。...原因是如果拷贝构造函数参数不是一个引用,即形如A(const A a),那么就相当于采用了方式(pass-by-value),而方式会调用该类拷贝构造函数,从而造成无穷递归地调用拷贝构造函数...显式或隐式地用同类型一个对象来初始化另外一个对象; b. 作为实参以值传递方式传递给一个函数; c. 在函数体内返回一个对象时,也会调用返回值类型拷贝构造函数; d.

2.4K30

如何禁止函数值调用

代码编译运行环境:VS2012+Debug+Win32 ---- 按照参数形式不同,C++应该有三种函数调用方式:值调用、引用调用和指针调用。...对于基本数据类型变量作为实参进行参数传递时,采用值调用与引用调用和指针调用效率相差不大。但是,对于类类型来说,值调用和引用调用之间区别很大,类对象尺寸越大,这种差别越大。...值调用与后面两者区别在于值调用在进入函数体之前,会在栈上建立一个实参副本,而引用和指针滴啊用没有这个动作。建立副本操作是利用拷贝构造函数进行。...原因是如果拷贝构造函数参数不是一个引用,即形如A(const A a),那么就相当于采用了方式(pass-by-value),而方式会调用该类拷贝构造函数,从而造成无穷递归地调用拷贝构造函数...作为实参以值传递方式传递给一个函数; c. 在函数体内返回一个对象时,也会调用返回值类型拷贝构造函数; d. 需要产生一个临时类对象时(类对象作为函数返回值会创建临时对象)。

2.8K10

《Effective Modren C++》 进阶学习(上)

cx=x; //cx是const int const int & rx=cx; //rx是指向const int引用 当将如上变量传递给f时,推导如下: f(x); //T是int,param类型是...Widget w1{}; // 正确,调用无参构造函数构造对象 「{}使用时缺点」 上述描述了{}种种优点,但其也存在一些缺点。...另外,在构造函数有参数情况中,若不包含std::initializer_list参数或者 构造传入实参,()和{}产生一样效果,否则{}优先匹配std::initializer_list参数构造函数...异常安全性:在C++中,异常安全性是一个重要概念,指的是程序在遇到异常时能够正确地处理资源释放和状态恢复。...理解特殊成员函数生成 在C++术语中,特殊成员函数是指自己生成函数。C++98有四个:默认构造函数、析构函数、拷贝构造函数和拷贝赋值函数

17120

类和对象之六大基础函数

,返回一个日期类型对象 // warning C4930: “Date d3(void)”: 调用原型函数(是否是有意用变量定义?)...使用已存在对象创建新对象(使用原变量构造内容相同变量)        2.函数参数类型为“类”类型对象(把自定义类当作参数类型值传入(形参))        3.函数返回值类型为类类型对象...由于在值时,会调用拷贝构造,去拷贝一份副本,作为中间变量传递,如果数据量小还没事,如果大了就会影响效率。...+: // 前置++和后置++都是一元运算符,为了让前置++与后置++形成能正确重载 // C++规定:后置++重载时多增加一个int类型参数,但调用函数时该参数不用传递,编译器 自动传递 // 注意...C++规定:后置++重载时多增加一个int类型参数,但调用函数时该参数不用传递,编译器 自动传递

50420

C++进阶:C++11(列表初始化、右值引用与移动构造移动赋值、可变参数模版...Args、lambda表达式、function包装器)

右值引用场景与意义 我们先来回顾一下左值引用意义——解决了什么问题 拷贝问题:在函数调用时,如果参数是通过值传递值)方式传递,会导致参数拷贝构造函数被调用,增加了额外开销。...在返回内置类型时,编译器会进行优化,避免不必要拷贝操作,直接将返回值传递给调用者或存储在临时变量中 将局部变量作为返回值返回,编译器会创建一个临时变量(临时对象)来存储这个返回值,从而避免返回一个指向已经被销毁内存引用...拷贝构造函数目的是将一个对象值复制到另一个对象中,以确保临时变量拥有正确值 那这个临时变量存在哪里呢?...这里就能使用完美转发 完美转发是 C++11 引入一个特性,用于在函数模板中保持参数值类别(左值或右值)和常量性,同时将参数原样传递给另一个函数。...因此,在C++11语法中出现了Lambda表达式 6.2lambda表达式 在C++中,Lambda表达式是一种匿名函数(本质是一个局部匿名函数对象),可以在需要函数对象地方使用,例如作为参数传递给标准算法函数

5900

C++】类六大默认成员函数及其特性(万字详解)

C++中通过引入this指针解决该问题,即:C++编译器给每个“非静态成员函数“增加了一个隐藏指针参数,让该指针指向当前对象(函数运行时调用该函数对象),在函数体中所有“成员变量操作,都是通过该指针去访问...只能在“成员函数内部使用。 this指针本质上是“成员函数形参,当对象调用成员函数时,将对象地址作为实参传递给this形参。所以对象中不存储this指针。...一个类只能有一个析构函数。若显式定义,系统会自动生成默认析构函数。...这涉及一项C++规定,即:按值传递会导致被调用函数使用调用程序中拷贝 即,当我们给函数值调用时,实际上是将原变量拷贝了一份给形参使用: 而对于C++自定义类型...,简直是毫无违和感有没有: 既然拷贝构造函数像刚才那样构建是有问题,那么我们该如何正确构建拷贝构造函数呢?

11110

C++编程经验(12):C++11新特性

不能传递一个 const son* 变量给一个处理 son*类型变量函数 update(const_cast(&csw)); // 正确,csw const 被显示地转换掉 update...update(dynamic_cast(pw)); // 正确传递给 update 函数一个指针是指向变量类型为 son pw 指针 void updateViaRef(son&...传递给 updateViaRef 函数 SpecialWidget pw 指针 ---- 智能指针 智能指针是存储指向动态分配(堆)对象指针类。...---- 绑定器是干嘛呢?将参数绑定到函数指针上。 以前绑定器只能绑定一个参数,所以我们看到很多古老需要函数指针做函数都只有一个参数传递,但是有了新绑定器就不一样了。...如果给类手动写了带参构造,那也是无法显式使用无参构造函数了。 如果没有了默认构造,子类就不能不参给父类进行构造了。

96920

C++之类和对象

指向其他对象) 3.this 指针本质上是“成员函数一个形参,当对象调用成员函数时,将对象地址作为实参传递给 this 形参,所以对象中不存储this 指针; 4.this 指针是“成员函数”...析构函数特性如下: 1.析构函数名是在类名前加上字符 ~ (表示与构造函数功能相反);; 2.无参数无返回值; 3.一个类只能有一个析构函数,若显式定义,系统会自动生成默认析构函数;(注意:...使用值方式编译器直接报错,因为会引发无穷递归调用; 3.若显式定义,编译器会生成默认拷贝构造函数; 4.默认拷贝构造函数对内置类型以字节为单位直接进行拷贝 – 浅拷贝,对自定义类型调用其自身拷贝构造函数...; 引用做参数 拷贝构造第二个特性说拷贝构造函数参数必须是引用,否则会有无穷递归现象产生,这是因为参本身就是一次拷贝(参是建立一个临时变量,然后将值拷贝给这个临时变量),而拷贝类就需要调用拷贝构造...在前面有说,C++给每个非静态函数加了一个隐藏this指针,这个指针就代表了对象本身,所以说只需要一个参数就够了。

1.1K00

C++C++入门 — 类和对象初步介绍

C++中,类(class)成员变量在内存中布局需要遵循内存对齐规则,主要是出于以下几个关键原因: 性能优化:(主要原因) 访问对齐内存地址在某些硬件架构上可能导致性能下降。...C++中通过引入this指针解决该问题 即:C++ 编译器给每个“非静态成员函数“增加了一个隐藏指针参数,让该指针指向当前对象(函数运行时调用该函数对象),在函数体中所有“成员变量操作,都是通过该指针去访问...只能在“成员函数内部使用 this指针本质上是“成员函数形参,当对象调用成员函数时,将对象地址作为实参传递给this形参。所以对象中不存储this指针。...每次调用非静态成员函数时,编译器都会自动将对象地址作为额外第一个参数传递给函数 尽管在源代码中我们并不直接看到这个参数。在函数体内部,this关键字用于引用这个隐含指针。...然而,在某些特定情况下,this指针确实可能为空,特别是在不正确使用情况下,比如: 当对象尚未完全构造完成时,即在构造函数初始化列表结束前或进入构造函数主体之前访问this,这时行为是未定义,编译器不会阻止这样行为

10010

C++拷贝构造函数

C++拷贝构造函数是一种特殊构造函数,用于创建对象时,使用一个已有对象内容来初始化新对象。它接受一个同类对象作为参数,并按照该对象数据成员值来创建新对象。...拷贝构造函数通常用于以下情况: 在创建对象时,使用同类已有对象值来初始化新对象。 以值传递方式将对象传递给函数。 以值返回方式从函数返回对象。...拷贝构造函数参数只有一个且必须是类类型对象引用,使用值方式编译器直接报错,因为会引发无穷递归调用。...若显式定义,编译器会生成默认拷贝构造函数。 默认拷贝构造函数对象按内存存储按字节序完成拷贝,这种拷贝叫做浅拷贝,或者值拷贝。...()函数,在fx()函数空间里存放一些变量,ret空间里内容会被fx()函数内容给覆盖 当出了作用域,返回对象还在没有析构,那就可以用引用返回,减少拷贝,比如用static修饰 值返回和址返回对比

4000

Chapter 5: Rvalue References, Move Semantics, PF

,本质上就是对该对象进行修改,所以语言不允许对函数修改传递给他们const对象,例如: class Annotation { public: //通过拷贝将参数按值传递并设为...rhs是左值变量,但引用内容是右值 //为了将内容传递给name_,需要将rhs右值内容通过move来获取 //最终传入string移动构造函数中...private: std::string name; }; 这样以来,构造函数不仅能正确匹配,而且可以使用移动语义将拷贝传递参数直接移动给成员变量。...这种做法核心是存在一个重载过函数作为客户端API,然后将任务分发到其他实现函数中。...//出错,不知道匹配哪一个模板函数实例 fwd(workOnVal); 正确做法是声明一个具体函数签名,存储到一个函数指针变量中,然后再传递给模板函数 using ProcessFuncType

5.1K40

CC++结构体完全攻略

但是,如果某个结构成员未被初始化,则所有跟在它后面的成员都需要保留为初始化。使用初始化列表时,C++ 不提供跳过成员方法。以下语句试图跳过 month 成员初始化。这是不合法。...与类对象一样,结构体变量也可以通过值、引用和常量引用传递给函数。...默认情况下,它们通过值传递,这意味着需要生成整个原始结构副本并传递给函数。因为不希望浪费时间来复制整个结构体,所以,除非结构很小,否则一般会通过引用将结构体传递给函数。...但是,这样意味着函数可以访问原始结构成员变量,从而可能更改它们。如果不想让函数更改任何成员变量值,那么可以考虑将结构体变量作为一个常量引用传递给函数。...下面程序定义了一个结构体变量并将其传递给了两个函数

92910
领券