十七 拷贝构造和拷贝赋值 浅拷贝和深拷贝 )如果一个类中包含指针形式的成员变量,缺省的拷贝构造函数只是复制了指针变量的本身,而没有复制指针所指向的内容,这种拷贝方式称为浅拷贝. )浅拷贝将导致不同对象之间的数据共享,如果数据存放在堆区,可能会在析构时引发"double free"异常,因此就需要自己定义一个支持复制指针指向的内容的拷贝构造函数,即深拷贝. 在C++类中会提供一个缺省的拷贝赋值运算符函数,完成两个对象直接的赋值操作.但是它和缺省拷贝构造函数类似,也是浅拷贝,为了得到深拷贝…
十四 构造函数和初始化表 ... 初始化表 )语法形式 class 类名{ 类名(形参表):成员变量1(初值),...{} }; )必须要使用初始化表的场景 -->如果有类 类型的成员变量,而该类又没有无参构造函数,则必须通过初始化表来初始化该成员变量. -->类中包含"const"和“引用”成员变量,必须在初始化表中显式的初始化. 注:成员变量的初始化顺序由声明顺序决定,而与初始化表的顺序无关. 练习:使用初始化表为电子时钟类增加计时器功能. 如果使用日历时间初始化时钟对…
------------------------------------移动构造------------------------------------------ 传统的深拷贝深赋值 对于类中,含有指针的情况,要自实现其拷贝构造和拷贝赋值.也就是所谓的深拷贝和深赋值.我想这己经成为一种共识了. 比如如下类: #include <iostream> using namespace std; class HasPtrMem { public: HasPtrMem():_d(new int(0))…
1static强化练习-仓库进货和出货 #define _CRT_SECURE_NO_WARNINGS #include <iostream> using namespace std; class Goods { public: // 无参数的构造函数 Goods() { next = NULL; weight = 0; cout << "创建了一个货物重量是" << 0 << "的物品" << endl;…
QObject 中没有提供一个拷贝构造函数和赋值操作符给外界使用,其实拷贝构造和赋值的操作都是已经声明了的,但是它们被使用了Q_DISABLE_COPY () 宏放在了private区域.因此所有继承自QObject的类都使用这个宏声明了他们的拷贝构造函数和赋值操作符为私有. 为什么要这样做? 我 们都知道Qt对标准C++增加了一些功能:signals, slots, object properties, events, event filters, string translation, ti…
QOject 中没有提供一个拷贝构造函数和赋值操作符给外界使用,其实拷贝构造和赋值的操作都是已经声明了的,但是它们被使用了Q_DISABLE_COPY () 宏放在了private区域.因此所有继承自QObject的类都使用这个宏声明了他们的拷贝构造函数和赋值操作符为私有. 为什么要这样做? 我们都知道Qt对标准C++增加了一些功能:signals, slots, object properties, events, event filters, string translation, time…
1. Map & multimap 的拷贝构造与赋值 map(const map &mp);               //拷贝构造函数 map& operator=(const map &mp);       //重载等号操作符 map.swap(mp);                           //交换两个集合容器 拷贝构造代码示例: 1 #include <iostream> 2 #include <map> 3 4 using…
1. 默认构造 set<int> setInt;              //一个存放int的set容器. set<float> setFloat;          //一个存放float的set容器. set<string> setString;         //一个存放string的set容器. multiset<int> mulsetInt;            //一个存放int的multi set容器. multiset<float…
合理的函数可提升时间和空间的利用率 //Test1.h #include<iostream> using namespace std; struct ST { private: int a; short b; public: ST(int a=0, short b=0):a(a),b(b) { this->a = a; this->b = b; cout<<"Object was Built. "<<this<<endl; }…
拷贝构造函数 一个构造函数的第一个参数是自身类类型的引用,额外的参数(如果有)都有默认值,那么这个构造函数是拷贝构造函数.拷贝构造函数的第一个参数必须是一个引用类型. 合成的拷贝构造函数   在我们没有定义自己的拷贝构造函数,编译器会为我们合成一个.但是对于有些类来说,合成拷贝构造函数用来阻止我们拷贝该类类型的对象.而一般情况,合成拷贝构造函数会将其参数的成员逐个拷贝到正在创建的对象中,编译器依次将每个非static成员拷贝到正在创建的对象中. 每个成员的类型决定了它如何拷贝:对类类型的成员,…
1: 一个空的class在C++编译器处理过后就不再为空,编译器会自动地为我们声明一些member function,如果你写 class A{}; 编译器处理后,就相当于: class A{ public: A();  //默认构造函数A(const A&);  //拷贝构造函数~A();  //析构函数A& operator=(const A& rhs); A* operator&();  //取地址运算符 const A* operator&() const;…
1,关于赋值的疑问: 1,什么时候需要重载赋值操作符? 2,编译器是否提供默认的赋值操作符? 2,关于赋值的疑问: 1,编译器为每个类默认重载了赋值操作符: 1,意味着同类型的类对象可以相互赋值: 2,默认的赋值操作符仅完成浅拷贝: 3,当需要进行深拷贝时必须重载赋值操作符: 1,和拷贝构造函数相同: 4,赋值操作符与拷贝构造函数有相同的存在意义: 3,默认赋值操作符重载编程实验: 1,main.cpp 文件: #include <iostream> #include <string&g…
之所以要把它们放在一起,是因为在使用C/C++类语言的时候,很容易混淆这几个概念(对Java来说完全没有这样的问题,表示Javaor完全没有压力). 先建立一个测试类(包含.h和.cpp) //~ Person.h #ifndef PERSON_H_ #define PERSON_H_ #include <iostream> class Person { private: static int counter; public: Person() { counter++; std::cout &…
1.构造函数: >构造函数是一个特殊的.与类同名的成员函数,用于给每一个成员设置适当的初始值. >构造函数不能有返回值,函数名与类名同样. >缺省构造函数时,系统将自己主动调用该缺省构造函数初始化对象,缺省构造函数会将全部数据成员都初始化为零或       空.缺省构造函数是不带參数的构造函数. >创建一个对象时,系统自己主动调用构造函数. 构造函数的特点: 1.构造函数能够重载,传入什么实參决定调用不同版本号的构造函数. 2.构造函数不能声明为const .也不能声明为virtu…
头文件 DString.h如下 #ifndef __DSTRING_H #define __DSTRING_H #endif #include <stddef.h> class DString { public: // [try (const DString s = NULL) later] DString(const char * c = NULL); // default constructor DString(const DString &str); // copy constr…
//############################################################################ /* * 处理拷贝赋值运算符=中自赋值的情况 * * * 运算符重载: 利用人们的直觉,减少学习曲线 */ // 自赋值的情况 dog dd; dd = dd; // 看起来很傻 dogs[i] = dogs[j]; // 看起来不怎么傻 /* 实现赋值运算符 */ class collar; class dog { collar* pCo…
拷贝构造与友元 拷贝构造是在构造一个对象的时候将已有对象的属性拷贝给新的对象:友元可以让一个类的所有属性(主要是private)对特定的类开放 拷贝构造 如果没有复写拷贝构造函数,系统会帮我们默认生成改函数 #include <iostream> using namespace std; class Demo { private: int a; public: void set(int a) {this->a = a;} int get() {return a;} }; int main…
#include <iostream> using namespace std; class ArrayIndexOutOfBoundsException{ // 异常类 public: int index; ArrayIndexOutOfBoundsException(int k){ index = k; } }; class Array{ private: int *data; int size; static const int dSize = 10; // 数组默认大小 public:…
构造函数:值的初始化,可带参数,无返回值,可重载,可存在多个 析构函数:释放对象内存空间,无参数,无返回值,不可重载,只能存在一个 拷贝构造函数:拷贝对象,其形参必须是引用 1.空类会默认添加哪些东西?怎么写?空类的大小是多少?为什么? 1)Empty():默认构造函数 2)Empty(const Empty&):拷贝构造函数 3)~Empty():析构函数 4)Empty& operate=(const Empty&):赋值运算符 空类的大小为1,因为C++要求类的每个实例必须具…
一.拷贝构造 如果一个构造函数的第一个参数是自身类类型的引用,且任何额外参数都没有默认值,则此构造函数是拷贝构造函数.(<C++Primer,第五版>) class Foo { public : Foo(); Foo(const Foo&); //拷贝构造函数 Foo& operator=(const Foo&); //拷贝赋值运算符 }; 类的成员中有指针时,使用深拷贝. #include <iostream> using namespace std; c…
一. 概述 通过几个简单的实验,回顾下派生类中拷贝构造的相关知识. 环境:Centos7 64位, g++ 4.8.5 在继承中,构造器与析构器均没有被继承下来.拷贝构造,也是一种构造,也没有被继承下来. 父类中,一部分成员需要拷贝构造来完成,子类,也有一部分成员需要拷贝构造来完成.子类中的内嵌子对象中的成员也需要拷贝构造来完成. 二. 实验过程 1.无自实现(系统默认) 派生类中,不自实现拷贝构造函数,看下系统默认的拷贝构造情况. 基类A,派生类C继承了基类A,派生类C中有一个内嵌子对象B b…
#include <iostream> using namespace std; class MyClass { public: MyClass(); MyClass(int i); MyClass(const MyClass &c); ~MyClass(); //后面main中测试发现func1 和func2之后没有调用拷贝构造,应该是被优化了 MyClass func1(int i){ cout<<"func1"<<endl; retur…
#include<iostream> using namespace std; class Vector { private: int *dwp; int size; void clone(const Vector v) { this->size=v.size; this->dwp=new int[size]; for(int i=0;i<size;i++) { dwp[i]=v[i];//调用重载下标,相当于this->dwp[i]=v.dwp[i] } } void…
今天下午在研究虚函数的时候遇到了一个问题,觉得很有意思,记录一下. 先看代码: class Base { public: Base(int value) { m_nValue = value; cout << "object(" << this << "){" << this->m_nValue << "} is constructing!" << endl; } ~B…
/** * 定义一个Employee类,包含雇员名字和一个唯一的雇员标识,为该类定义默认构造函数和参数为表示 * 雇员名字的string构造函数.如果该类需要复制构造函数或赋值操作符,实现这些函数 * * 注意:static数据成员必须在类定义体的外部定义(正好一次),static成员不是通过类构造函数进行初始化 * 而是应该在定义时进行初始化. * (保证对象正好定义一次的最好方法就是将static数据成员的定义放在包含类的非内联成员函数定义的文件中) * static数据成员通常在定义时才初…
C++ 进阶5 拷贝构造 深度复制 运算符重载 20131026 例子: 运行环境是G++ 编译, /* * main.cpp * *  Created on: 2013年10月26日 *      Author: yangtfei */ #include <iostream> #include <cstring> #include <stdlib.h> #include <stdio.h> using namespace std; class Base{…
#include <iostream> using namespace std; class A { public: A(int a) {}; A(const A&) = default; }; class B : public A{ public: B(int b) : A(b) {}; B(const A& a) : A(a){ cout << "B copy construction" << endl; }; //B(const…
#include<iostream> #include <stdio.h> using namespace std; class test{ int mvalue; public: explicit test(int i=){ //此处的explicit表明该构造函数需要显示的调用 printf("%s(%d)\n", __func__, i); mvalue = i; } test& operator=(const test& that) {…
//*基类中的static成员,在整个继承层次中只有一个实例 //*在派生类中访问基类中的static成员的方法 //1.基类名::成员名 //2.子类名::成员名 //3.对象.成员名 //4.指针->成员名 //5.成员名 #include <iostream>//txwtech-CppPrimer_静态成员与继承cc31a_demo using namespace std; //*基类中的static成员,在整个继承层次中只有一个实例 //*在派生类中访问基类中的static成员的…