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

C++ 复制控制之复制构造函数

不是没有声明复制控制函数时编译器就一定会帮类声明,需要满足一定条件。 C++类用三个特殊成员函数复制构造函数、赋值操作符和析构函数 来决定类对象之间初始化或赋值时发生什么。...,将隐式地调用复制构造函数。...(C++隐式类型转换),然后调用复制构造函数进行数组元素复制。...类类型:调用该类复制构造函数进行复制。 数组:这个比较特殊,因为我们知道一般不能复制数组,但在类中,复制数组时合成复制构造函数复制数组每一个值。...禁止复制 如果我们想禁止某个类复制行为,我们当然不会想去定义一个复制构造函数,然而编译器却会自动为我们定义一个,那么到底该如何阻止一个类复制行为呢?

75830

C++构造函数调用规则 ( 默认构造函数 | 默认无参构造函数 | 默认拷贝构造函数 | 构造函数调用规则说明 )

函数体为空 , 不做任何操作 ; 默认拷贝构造函数 : 如果 C++ 类中 没有定义拷贝构造函数 , C++ 编译器会自动为该类提供一个 " 默认拷贝构造函数 " , 在函数中对成员变量进行简单复制操作...; MyClass obj; // 调用 默认 构造函数 2、默认拷贝构造函数 " 默认拷贝构造函数 " 用于创建一个新对象作为现有对象副本 , 其作用是将 现有对象 成员变量 复制到 新对象中...; 创建一个类对象 并将其 赋值给 另一个类对象时 , 会自动调用 默认拷贝构造函数 ; 如果 C++ 类中 没有定义拷贝构造函数 , C++ 编译器会自动为该类提供一个 " 默认拷贝构造函数 " ,...在函数中对成员变量进行简单复制操作 ; 没有定义拷贝构造函数 : 如果 没有为 C++ 类定义 拷贝构造函数 , C++ 编译器 将自动为该类 生成一个 默认拷贝构造函数 ; 定义了拷贝构造函数...复制 ; 特例 : 如果 C++ 类中 , 定义了 拷贝构造函数 , 那么 C++ 编译器不会提供 默认无参构造函数 ; 2、代码示例 - 只定义拷贝构造函数 下面的代码中 , 定义了 拷贝构造函数

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

C++】This指针和复制构造函数

复制构造函数一种特殊构造函数,在创建一个新对象时将其他对象作为参数时, 编译器将会调用复制构造函数。不提供时使用默认构造函数。默认构造函数内部各个成员变量赋值。...CTime(CTime& time);//使用类名对象作为参数,传引用 调用复制构造函数时机: 在什么情况下使用复制构造函数 1.以其他对象作为参数创建新对象时。...func(time);//第二次调用复制构造函数 复制给func中形参time CTime time3 = func1(time);//第三次和第四次调用复制构造函数...如果我们把复制构造函数 CTime::CTime(CTime& time)修改为CTime::CTime(CTime time) CTime& time是一个引用类型参数,现在将引用去掉的话,就满足了调用复制构造函数一种...我们使用类对象作为函数参数时候,以及返回一个对象时候,代价是很大, 因为伴随着对象创建和销毁,还伴随着复制构造函数调用, 所以一般使用传引用来规避这种代价!

80220

小朋友学C++(10):子类构造函数调用父类构造函数

从哲学层面来看,子类会继承父类除private以外所有成员。 因为构造函数是公有的,所以理所当然地会被子类继承。...程序1: #include using namespace std; class Shape { public: Shape() { cout <...分析: 这里构造函数写法是 Rectangle() : Shape() { 子类构造函数本身语句; } 这是先调用父类构造函数,再执行它本身语句。从运行结果也可以看出这一点。...那么,如果不显示调用父类构造函数Shape()呢?父类构造函数就不被调用了吗? 咱们可以用下面的程序来验证。...分析: 从运行结果可以看出,程序1和程序2运行结果完全一致。也就是说,Shape()即使不显示调用,实际上也会被调用。并且调用顺序优先于子类本身构造函数

1.3K60

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

一、构造函数意义 1、类构造函数 C++ 提供 构造函数 和 析构函数 作为 类实例对象 初始化 和 销毁 方案 ; 定义一个类 若干 实例对象 , 每个对象都有独立 成员属性 ; 当 定义...类 实例对象时 , C++ 编译器 会自动调用 开发者定义 构造函数 ; 2、构造函数显式调用与隐式调用 构造函数 可以 自动调用 , 也可以手动调用 ; 一般 默认 无参构造函数 是 自动地...由 C++ 编译器默认提供 ; 默认构造函数 分为 2 种类型 : 默认无参构造函数 : 如果 类 中没有定义 构造函数 , C++ 编译器 会默认提供一个 无参构造函数 , 该构造函数函数体为空...; 默认拷贝构造函数 : 如果 类 中没有定义 拷贝构造函数 , C++ 编译器 会默认定义一个 默认拷贝构造函数 , 该函数作用是进行简单成员变量赋值 ; 6、代码示例 - 初始化函数无法及时调用..., C++ 编译器 会提供一个 默认构造函数 // Student 类 没有提供拷贝构造函数 , C++ 编译器 会提供一个 默认拷贝构造函数 Student s; // 调用初始化函数 s.init

38720

编译器角度看C++复制构造函数

[C++对象模型]复制构造函数建构操作 关于复制构造函数简单介绍,可以看我以前写过一篇文章C++复制控制之复制构造函数该文章中介绍了复制构造函数定义、调用时机、也对编译器合成复制构造函数行为做了简单说明...类Bitwise copy 语意 《Effective C++》中说到: 如果你自己没声明,编译器就会为它声明一个copy构造函数、一个copy assignment操作符和一个析构函数。...实际上在《深度探索C++对象模型》中对编译器行为并不是这样描述。对于默认构造函数复制构造函数,都需要类满足一定条件时编译器才会帮你合成。那么需要满足些什么条件呢?...说实话这问题我也很疑惑,查看了许多资料,反复看了《深度探索C++对象模型》后,我最终这样认为:展现了Bitwise copy语意类编译器不会为它写一个函数实体进行成员复制。...前两种情况中,编译器必须将“类成员或基类复制构造函数调用操作”安插到新合成复制构造函数中去,如果类设计者已经明确声明了一个复制构造函数,则这些调用操作代码将插入到已有的复制构造函数中去(在函数最前端插入

56570

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

所以看完这个博客不要就记住了构造函数赋值作用,他还有其他很多作用。 首先从本质上理解构造函数: 在 C++ 程序中,变量在定义时可以初始化。如果不进行初始化,变量初始值会是什么呢?...在C++中,有一种特殊成员函数,它名字和类名相同,没有返回值,不需要用户显式调用(用户也不能调用),而是在创建对象时自动执行。这种特殊成员函数就是构造函数(Constructor)。...在C++语言中,“构造函数”就是一类特殊成员函数,其名字和类名字一样,并且不写返回值类型(void 也不写)。 构造函数可以被重载,即一个类可以有多个构造函数。...一旦用户自己定义了构造函数,不管有几个,也不管形参如何,编译器都不再自动生成。...这是C++内部实现机制,这里不再深究,初学者可以按照上面说“一定有一个空函数默认构造函数”来理解。 最后需要注意一点是,调用没有参数构造函数也可以省略括号。

1.3K20

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

调用顺序如下 : 先调用 被嵌套类 A 和 B 构造函数 , 再调用外部 C 类构造函数 ; A 和 B 构造函数 , 成员变量 中 谁先声明 , 就先调用 构造函数 ; 注意 : A...和 B 在 构造函数 初始化列表 中顺序 , 与先调用构造函数无关 ; 2、析构函数调用顺序 析构函数调用顺序 与 构造函数调用顺序相反 , 直接 将 构造函数 调用顺序 倒序排列即可 ; 3、...拷贝构造函数也可以定义初始化列表 如果一个类 没有定义 无参构造函数 , 只有一个 有参构造函数 , 此时 , C++ 编译器 不会为其 生成 默认无参构造函数 ; 这种场景下 涉及到了 构造函数...类型 : 强制在初始化列表中调用构造函数 : 如果类中定义了 有参构造函数 , 导致 无参构造函数 被屏蔽 , 那么 在 所有的构造函数 初始化列表中 , 都必须强制调用 子对象 构造函数 ;...- 构造 / 析构 函数调用顺序分析 #include "iostream" using namespace std; class A { public: // 带参构造函数 A(int age,

22420

C++复制构造函数和赋值运算符

前言: C++面向对象编程过程中,凡是在类中运用到动态内存分配时候总是会写一个显示复制构造函数和赋值重载运算符,本文将结合C++ Primer Plus一书内容分析下原因: 一、在C++编程中如果没有编写下列成员函数...但是(4)(5)会造成较大影响 二、赋值构造函数 1、函数原型  Class_name(const Class_name &) 2、什么时候会用调用复制构造函数?    ...当同时满足以下两个条件时候就会自动调用复制构造函数:     (1)新建一个对象;     (2)使用同类中现有对象初始化新对象。    ...而void show2(Str a)是按值传递,按值传递过程是需要拷贝参数副本到形参中,这就需要新建一个Str对象,然后用已有的s1对象初始化,满足了调用复制构造函数两个条件。...由于默认复制构造函数中没有num++,而不管用那个构造函数构造对象调用都是同一个析构函数,而析构函数中含有num--,所以临时对象导致num多减了一次,所以最后一句话会出现,“析构后对象个数是-

1.1K70

C++构造函数

类对象初始化 很多时候我们希望在创建一个类对象同时能够给它数据成员赋初值,因为类数据成员是不能在声明时候赋初值,所以一种方法是可以通过定义成员函数来给数据成员赋初值,但有时候我们可能会忘记去调用这个函数...,因此能不能建立一种机制,让系统自动调用赋初值函数呢?...这就引出了构造函数构造函数 C++提供了构造函数来处理对象初始化。构造函数是一种特殊成员函数,与其他成员函数不同,不需要用户来调用它,而是在建立对象时自动执行。...如果用户自己没有定义构造函数,则C++系统会自动生成一个构造函数,只是这个构造函数函数体是空,也没有参数,不执行初始化操作。...我们在类外定义这个默认构造函数: Point::Point() { x=0; y=0; } 这样,我们在定义新一个类对象时候,系统就会自动调用这个函数给x和y赋初值。 下面我们来看带参数

12830

C++构造函数分类 ③ ( 调用有参构造函数方法 | 括号法 | 等号法 )

一、在不同内存中创建类实例对象 在上一篇博客 【C++构造函数分类 ② ( 在不同内存中创建类实例对象 | 栈内存中创建实例对象 | new 关键字创建对象 ) 中 , 分析了 在 栈内存 和...堆内存 中创建对象 两种情况 ; 本篇博客中 , 继续分析 , 栈内存中调用 有参构造函数 两种方法 : 括号法 等号法 C++ 类成员变量为 : public: int m_age; char...有参构造函数 , 并将创建 实例对象 赋值给 s5 变量 , 这是 C++ 对 = 等号运算符增强 ; // 使用 等号法 调用 有一个参数 有参构造函数 // C++ 对等号进行了功能增强...std; class Student { public: // 无参构造函数 Student() { // 为 m_name 成员分配内存 m_name = (char*)malloc...有一个参数 有参构造函数 // C++ 对等号进行了功能增强 Student s5 = "K"; // 打印 Student s4 实例对象值 cout << "name : " << s5

17140

C++ 构造函数与析构函数调用函数注意事项

虽然可以对虚函数进行实调用,但程序员编写虚函数本意应该是实现动态联编。在构造函数调用函数函数入口地址是在编译时静态确定,并未实现虚调用。...但是为什么在构造函数调用函数,实际上没有发生动态联编呢? 第一个原因,在概念上,构造函数工作是为对象进行初始化。在构造函数完成之前,被构造对象被认为“未完全生成”。...当创建某个派生类对象时,如果在它基类构造函数调用函数,那么此时派生类构造函数并未执行,所调用函数可能操作还没有被初始化成员,将导致灾难发生。...在Visual C++中,包含虚函数类对象虚指针被安排在对象起始地址处,并且虚函数表(vtable)地址是由构造函数写入虚指针。...因此,一般情况下,应该避免在构造函数和析构函数调用函数,如果一定要这样做,程序猿必须清楚,对虚函数调用其实是实调用

91110

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

构造函数初始化列表 总结 : 初始化列表 可以 为 类 成员变量 提供初始值 ; 初始化列表 可以 调用 成员变量 类型 构造函数 进行成员变量初始化操作 ; 初始化列表 可以 使用 构造函数...中传入 参数 ; 类初始化时 , 根据定义顺序 , 先调用 成员变量 构造函数 , 然后调用外部类构造函数 , 析构函数正好相反 ; 实例对象 const 成员变量 必须只能在 初始化列表 中进行...初始化 , 所有的构造函数都要进行初始化操作 ; 构造函数 中 不能调用 构造函数 ; 一、匿名对象 生命周期 1、匿名对象 生命周期 说明 调用 类名(构造函数参数) 创建是 匿名对象 ; 匿名对象...二、构造函数调用 构造函数 ---- 1、构造函数 中 不能调用 构造函数 构造函数调用 构造函数 是危险行为 ; 构造函数调用 构造函数 , 并不会为本对象进行初始化操作 ; 构造函数 调用方式...执行 Student 构造函数" << endl; } 然后 , 在无参 构造函数中 , 调用 有参构造函数 ; // 构造函数调用 构造函数 是危险行为 Student() { /

17720

C++构造函数与析构函数概念简介 ( 构造函数和析构函数引入 | 构造函数定义与调用 | 析构函数定义与调用 | 代码示例 )

" 构造函数 " 是 C++ 类中一种特殊 " 成员函数 " , 该函数不需要用户手动调用 , 而是在 C++ 类 实例对象 创建时 , 自动执行 ; " 析构函数 " 是 构造函数 对应相反函数...名称 与 类名相同 ; 构造函数参数 : 构造函数 可以有 若干参数 , 也可以没有参数 ; 构造函数返回值 : 构造函数 没有返回值 ; 2、构造函数调用 构造函数调用 : 自动调用 : C++ 编译器会...在创建 C++ 类实例对象时 , 自动调用 构造函数 ; 手动调用 : 构造函数 也可以手动调用 , 如调用构造函数重载函数 ; 3、代码示例 - 构造函数定义与调用 定义了一个 C++ 类 Student...s1, s2; 在代码中声明了 2 个 Student 变量 , 构造函数调用了 2 次 ; 代码示例 : #include "iostream" using namespace std; class...; 析构函数返回值 : 析构函数 没有返回值 ; 2、析构函数调用 析构函数调用 : 自动调用 : C++ 编译器会 在销毁 C++ 类实例对象时 , 自动调用 析构函数 ; 3、代码示例 - 析构函数定义与调用

16220

C++构造函数分类 ① ( 构造函数分类简介 | 无参构造函数 | 有参构造函数 | 拷贝构造函数 | 代码示例 - 三种类型构造函数定义与调用 )

一、构造函数分类 1、构造函数分类简介 C++ 构造函数可以分为以下几类 : 无参构造函数 : 最简单也是默认构造函数 , 函数没有参数 , 如果创建一个对象 , 没有传入参数 , 调用就是该类型...< endl; } 下面的代码 , 是自动调用无参构造函数 , 创建 实例对象 方法 ; // 调用无参构造函数 Student s1; // 打印 Student s1 实例对象值 cout..." << endl; } 二、代码示例 - 三种类型构造函数定义与调用 ---- 在下面的代码中 , 分别在 Student 类中定义了 无参构造函数 有参构造函数 拷贝构造函数 分别调用了上述三种类型...构造函数 ; 完整代码示例 : #include "iostream" using namespace std; class Student { public: // 无参构造函数 Student...: " << s1.m_name << " , age : " << s1.m_age << endl; // 手动调用有参构造函数 // 直接调用构造函数会产生匿名对象, 涉及到该匿名对象生命周期

27310

C++不要在构造函数和析构函数调用函数

虽然可以对虚函数进行实调用,但程序员编写虚函数本意应该是实现动态联编。在构造函数调用函数函数入口地址是在编译时静态确定,并未实现虚调用。...但是为什么在构造函数调用函数,实际上没有发生动态联编呢? 1. 不要在构造函数调用函数原因 第一个原因,在概念上,构造函数工作是为对象进行初始化。...当创建某个派生类对象时,如果在它基类构造函数调用函数,那么此时派生类构造函数并未执行,所调用函数可能操作还没有被初始化成员,浙江导致灾难发生。...在Visual C++中,包含虚函数类对象虚指针被安排在对象起始地址处,并且虚函数表(vtable)地址是由构造函数写入虚指针。...因此,一般情况下,应该避免在构造函数和析构函数调用函数,如果一定要这样做,程序猿必须清楚,这是对虚函数调用其实是实调用

2.7K30

C++带参数构造函数 | 有参构造函数

C++带参数构造函数C++中,程序员希望对不同对象赋予不同初值,可以采用带参数构造函数,在调用不同对象构造函数时,从外面将不同数据传递给构造函数, 以实现不同初始化。...C++构造函数首部一般形式为  构造函数名(类型1 形参1,类型2 形参2,… ) 程序员是不能调用构造函数,因此无法采用常规调用函数方法给出实参,实参是在定义对象时给出。...C++定义对象一般形式为  类名 对象名(实参1,实参2,…); C++数据成员是不能在声明类时初始化,如果一个类中所有的成员都是公用,则可以在定义对象时对数据成员进行初始化。...如果数据成员是私有的, 或者类中有private或protected成员,则不能用这种方法初始化。 案例:C++求体积,要求在类中用带参数构造函数。...以上,如果你看了觉得对你有所帮助,就给小林点个赞叭,这样小林也有更新下去动力,跪谢各位父老乡亲啦~ C++带参数构造函数 | 有参构造函数 更多案例可以go公众号:C语言入门到精通

3.7K64

C++ std::isnan等函数使用

今天在使用Modbus读取设备对应寄存器float状态值时,出现一些问题,导致数据不能正常获取,最后发现原来设备对应寄存器里面会出现一些无效值,导致读取显示出错,没做容错判断处理。...值可能不是有效float类型,比如说:-1....注意 对于float类型值,C和C++11中都做了相应处理,用于判断一个float值是否为无穷大、非数( NaN )值; 有多个拥有不同符号位和载荷不同 NaN 值,参阅 std::nan 及...IEEE-754 不要求复制 NaN 保留其位表示(符号与载荷),尽管大多数实现保留。...(0.0) = false isnan(DBL_MIN/2.0) = false isnan(0.0 / 0.0) = true isnan(Inf - Inf) = true 有时候发现不少函数以前没怎么用过

6.8K41
领券