1.类的行为分类:看起来像一个值:看起来想一个指针.     1)类的行为像一个值,意味着他应该有自己的状态.当我们拷贝一个像值的对象时,副本和原对象是完全独立的.改变副本不会对原有对象有任何影响,反之亦然.     2)行为像指针的类则共享状态.当我们拷贝一个这种类的对象时,副本和原对象使用相同的底层数据.改变副本也会改变原对象,反之亦然.     3)举例:标准库容器和string类行为像一个值:shared_ptr行为类似指针:IO类型和unique_ptr不允许拷贝或者赋值,他们既不…
拷贝构造函数 一个构造函数的第一个参数是自身类类型的引用,额外的参数(如果有)都有默认值,那么这个构造函数是拷贝构造函数.拷贝构造函数的第一个参数必须是一个引用类型. 合成的拷贝构造函数   在我们没有定义自己的拷贝构造函数,编译器会为我们合成一个.但是对于有些类来说,合成拷贝构造函数用来阻止我们拷贝该类类型的对象.而一般情况,合成拷贝构造函数会将其参数的成员逐个拷贝到正在创建的对象中,编译器依次将每个非static成员拷贝到正在创建的对象中. 每个成员的类型决定了它如何拷贝:对类类型的成员,…
定义行为像值的类 行为像值的类,例如标准库容器和std::string这样的类一样,类似这样的类我们可以简单的实现一个这样的类HasPtr. 在实现之前,我们需要: 定义一个拷贝构造函数,完成string的拷贝,而不是指向string的指针的拷贝: 定义一个拷贝赋值运算符,释放当前的string,并从右侧拷贝新的string. 定义一个析构函数来释放string class HasPtr { public: HasPtr(const std::string& s = std::string())…
拷贝, 赋值与销毁 当定义一个类时, 我们显示地或隐式地指定在此类型的对象拷贝, 移动, 赋值和销毁时做什么. 一个类通过定义5种特殊的成员函数来控制这些操作, 包括: 拷贝构造函数, 拷贝赋值运算符, 移动构造函数, 移动赋值运算符和析构函数. 编译器可以合成这些成员函数, 其他的函数不能合成. 拷贝和移动构造函数定义了当用同类型的一另一个对象初始化本对象时做什么, 拷贝和移动赋值运算符定义了将一个对象赋予同类型的另一个对象时做什么. 这些操作称为拷贝控制操作. 如果我们不显式地定义这些操作,…
1.阻止拷贝的原因:对于某些类来说,拷贝构造函数和拷贝赋值运算符没有意义.举例:iostream类阻止了拷贝,以避免多个对象写入或者读取相同的IO缓冲.   2.阻止拷贝的方法有两个:新标准中可以将成员函数定义成删除的函数:在旧标准中可以使用private进行拷贝控制,只声明不定义.推荐使用第一种.   3.删除的函数:对函数进行了声明,但是不能以任何方式使用它们,通过在函数参数列表后面加上=delete来将函数定义成删除的.=delete必须出现在函数第一次声明的地方. struct NoCo…
1.一个类通过定义五种特殊的成员函数来控制此类型对象的拷贝.移动.赋值和销毁:拷贝构造函数.拷贝赋值运算符.移动构造函数.移动赋值运算符和析构函数.(拷贝.移动.析构)   2.拷贝和移动构造函数定义了当用同类型的另一个对象初始化本对象时做什么:拷贝和移动赋值运算符定义了讲一个对象赋予同类型的另一个对象时做什么:析构函数定义了当此类型对象销毁时做什么.这些操作统称为拷贝控制操作.   3.如果一个类没有定义所有这些拷贝控制成员,编译器会自动为它定义缺失的操作.   4.拷贝构造函数:构造函数的第…
1.析构函数:释放对象使用的资源,并销毁对象的非static数据成员:析构函数不接受参数,因此不能被重载.对于一个给定类,有且只有一个析构函数.   2.析构函数的组成:一个函数体+一个析构部分(implicit):所完成的工作:先执行函数体,然后按照初始化成员的逆序销毁成员.在这里需要注意的是销毁成员的并不是函数体,而是析构部分.   3.什么时候会调用析构函数:     1)变量在离开其作用域时     2)当一个对象被销毁时,其成员被销毁     3)容器被销毁时,其元素被销毁     4…
1,什么是类的拷贝控制 当我们定义一个类的时候,为了让我们定义的类类型像内置类型(char,int,double等)一样好用,我们通常需要考下面几件事: Q1:用这个类的对象去初始化另一个同类型的对象. Q2:将这个类的对象赋值给另一个同类型的对象. Q3:让这个类的对象有生命周期,比如局部对象在代码部结束的时候,需要销毁这个对象. 因此C++就定义了5种拷贝控制操作,其中2个移动操作是C++11标准新加入的特性: 拷贝构造函数(copy constructor) 移动构造函数(move con…
当存在继承关系时,派生类的作用域嵌套在其基类的作用域之内.如果一个名字在派生类的作用域内无法正确解析,则编译器将继续在外层的基类作用域中寻找该名字的定义 在编译时进行名字查找: 一个对象.引用或指针的静态类型决定了该对象的哪些成员是可见的,即使静态类型与动态类型不一致: #include <iostream> using namespace std; class A{ public: // A(); // ~A(); ostream& print(ostream& os) co…
普通类型对象之间的复制很简单,而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员变量,这篇文章将帮你理清C++类对象的拷贝方式 拷贝构造函数,拷贝赋值运算符 首先我们简单了解下默认的拷贝构造函数和拷贝赋值运算符 拷贝构造函数 第一个参数是自身类类型引用,其他参数都有默认值的构造函数就是拷贝构造函数 class Sales_data { public: Sales_data(); //默认构造函数 Sales_data(const Foo&); //默认拷贝构造函数 //... };…