类拓展——拷贝控制成员

一、拷贝控制操作之于类

作用:定义类对象拷贝、移动、赋值或销毁时做什么

没有定义:编译器会为我们定义,但合成版本的行为可能并非我们所想

二、拷贝构造函数

1. 每个成员的类型决定了它如何拷贝

  类类型的成员,会使用其拷贝构造函数来拷贝;内置类型的成员则直接拷贝。

  对于数组,合成拷贝构造函数会逐元素地拷贝一个数组类型的成员。

2. 细节

第一个参数是自身类类型的引用,且任何额外参数都有默认值

通常不应该是explicit的,因为它经常会被隐式地使用

即使定义了拷贝构造函数,编译器也会生成合成版本

三、拷贝赋值运算符

1. 工作过程

将右侧运算对象的每个非static成员了赋予左侧运算对象的对应成员,这通过成员类型的拷贝赋值运算符来完成。

2. 细节

类未定义自己的拷贝赋值运算符,编译器会为它合成一个

合成版本返回一个指向其左侧运算对象的引用

四、析构函数

1. 工作过程

析构函数有一个函数体和一个析构部分,在一个析构函数中,首先执行函数体,然后销毁成员。

在一个析构函数中,不存在类似构造函数中初始化列表的东西来控制成员如何销毁,析构部分是隐式的。

如一个合成版本的空析构函数体执行完毕后,成员在隐含的析构阶段中被销毁,如销毁string成员时会调用string的析构函数来释放其所占内存。

2. 成员销毁时发生什么完全依赖于成员的类型

类类型的成员在销毁时,执行成员自己的析构函数;内置类型没有析构函数,因此销毁内置类型什么也不需要做。

故隐式销毁一个内置指针类型的成员不会delete它所指向的对象。

3. 细节

类未定义自己的析构函数时,编译器会为它合成一个

时间: 2024-07-30 10:19:57

类拓展——拷贝控制成员的相关文章

C++的那些事:类的拷贝控制

1,什么是类的拷贝控制 当我们定义一个类的时候,为了让我们定义的类类型像内置类型(char,int,double等)一样好用,我们通常需要考下面几件事: Q1:用这个类的对象去初始化另一个同类型的对象. Q2:将这个类的对象赋值给另一个同类型的对象. Q3:让这个类的对象有生命周期,比如局部对象在代码部结束的时候,需要销毁这个对象. 因此C++就定义了5种拷贝控制操作,其中2个移动操作是C++11标准新加入的特性: 拷贝构造函数(copy constructor) 移动构造函数(move con

拷贝控制成员和构造函数实例

理解拷贝控制成员和构造函数的一个好方法是定义一个简单的类,为该类定义这些成员,每个成员都打印出自己的名字. 拷贝初始化通常使用拷贝构造函数来完成. #include<stdio.h> #include<iostream> #include<vector> using namespace std; #include <iostream> #include <vector> #include <initializer_list> stru

OOP3(继承中的类作用域/构造函数与拷贝控制/继承与容器)

当存在继承关系时,派生类的作用域嵌套在其基类的作用域之内.如果一个名字在派生类的作用域内无法正确解析,则编译器将继续在外层的基类作用域中寻找该名字的定义 在编译时进行名字查找: 一个对象.引用或指针的静态类型决定了该对象的哪些成员是可见的,即使静态类型与动态类型不一致: 1 #include <iostream> 2 using namespace std; 3 4 class A{ 5 public: 6 // A(); 7 // ~A(); 8 ostream& print(ost

面向对象程序设计——抽象基类,访问控制与继承,继承中的类作用域,拷贝函数与拷贝控制

一.抽象基类 1)纯虚函数 和普通的虚函数不同,一个纯虚函数无须定义.我们通过在函数体的位置(即在声明语句的分号之前)书写=0就可以将一个虚函数说明为纯虚函数.其中,=0只能出现在类内部的虚函数声明语句处. 值得注意的是,我们也可以为纯虚函数提供定义,不过函数体必须定义在类的外部.也就是说,我们不能在类的内部为一个=0的函数提供函数体. 2)含有纯虚函数的类是抽象基类 含有(或者未经覆盖直接继承)纯虚函数的类是抽象基类.抽象基类负责定义接口,而后续的其他类可以覆盖该接口.我们不能直接创建一个抽象

【足迹C++primer】45、拷贝控制示例

拷贝控制示例 那么接下来尽情欣赏这个案例吧!!! /** * 功能:拷贝控制示例 * 时间:2014年7月14日10:57:39 * 作者:cutter_point */ #include<iostream> #include<set> #include<vector> #include<string> using namespace std; class Folder; /** Message类 */ class Message { friend void

【足迹C++primer】54、继承类的范围,构造函数和拷贝控制

继承类的范围,构造函数和拷贝控制 当用派生类执行函数的时候,首先会在当前的类里面找 如果找不到就一级一级地往上找. Name Lookup Happens at Compile Time class Quote { public: Quote()=default; Quote(const string &book, double sales_price):bookNo(book), price(sales_price) {cout<<"Quote gouzhao functi

基类和派生类中构造函数和拷贝控制

15.26 定义Quote和Bulk_quote的拷贝控制成员,令其与合成的版本行为一致.为这些成员以及其他构造函数添加打印状态的语句,使得我们能够知道正在运行哪个程序.使用这些类编写程序,预测程序将创建和销毁哪些对象.重复实验,不断比较你的预测和实际输出结果是否相同,直到预测完全准确再结束. Quote.h #ifndef QUOTE_H #define QUOTE_H #include<iostream> #include<string> using namespace std

拷贝控制

当定义一个类时,我们显式地或隐式地指定在此类型的对象拷贝.移动.赋值和销毁时做什么.一个类通过定义五种特殊的成员函数来控制这些操作,包括:拷贝构造函数(copy constructor).拷贝赋值运算符(copy-assignment operator).移动构造函数(move constructor).移动赋值运算符(move-assignment operator)和析构函数(destructor).拷贝和移动构造函数定义了当用同类型的另一个对象初始化本对象时做什么.拷贝和移动赋值运算符定义

C++中类的拷贝控制 与之相关的几个函数

转自:http://www.cnblogs.com/ronny/p/3734110.html 对于部分内容会在接下来的文章中详细介绍 1,什么是类的拷贝控制 当我们定义一个类的时候,为了让我们定义的类类型像内置类型(char,int,double等)一样好用,我们通常需要考下面几件事: Q1:用这个类的对象去初始化另一个同类型的对象. Q2:将这个类的对象赋值给另一个同类型的对象. Q3:让这个类的对象有生命周期,比如局部对象在代码部结束的时候,需要销毁这个对象. 因此C++就定义了5种拷贝控制