新Visual C++应用教程 教学课件 郑阿奇 丁有和 第1章C++基础1.pptVIP

  • 11
  • 0
  • 约2.63万字
  • 约 58页
  • 2016-10-26 发布于广东
  • 举报

新Visual C++应用教程 教学课件 郑阿奇 丁有和 第1章C++基础1.ppt

第一章C++基础 1.1C++概述 1.1C++概述 1.1C++概述 1.1C++概述 1.1C++概述 1.1C++概述 1.2类和对象 1.2类和对象 1.2类和对象 1.2类和对象 1.2类和对象 1.2类和对象 1.2类和对象 1.2类和对象 1.2类和对象 1.2类和对象 1.2类和对象 1.2类和对象 1.2类和对象 1.2类和对象 1.2类和对象 1.2类和对象 1.2类和对象 1.2类和对象 1.2类和对象 1.2类和对象 1.2类和对象 1.2类和对象 1.2类和对象 1.2类和对象 1.2类和对象 1.3继承和派生 1.3继承和派生 1.3继承和派生 1.3继承和派生 1.3继承和派生 1.3继承和派生 1.3继承和派生 1.3继承和派生 1.3继承和派生 1.3继承和派生 1.3继承和派生 1.3继承和派生 1.4多态和虚函数 1.4多态和虚函数 1.4多态和虚函数 1.4多态和虚函数 1.4多态和虚函数 1.4多态和虚函数 1.4多态和虚函数 1.2.7 对象赋值和拷贝构造函数 1. 对象赋值 在C++中,一个类的对象的初值设定可以有多种形式。例如,对于前面的类CName来说,则可有下列对象的定义方式: CName o1; // 通过A显式默认构造函数设定初值 CName o2(“DING”); // 通过B重载构造函数设定初值 等都是合法有效的。但是若有: o1 = o2; // 通过赋值语句设定初值 则虽合法,因为同类型的变量可以直接用“=”赋值,但运行后却会出现程序终止,这是为什么呢? 这是因为对于“CName o1;”这种定义方式,编译会自动调用相应的默认构造函数,此时显式的默认构造函数使私有指针成员strName为空值;而“o1 = o2;”中,C++赋值运算符的操作是将右操作对象的内容拷贝(复制)到左操作对象的内存空间中,由于左操作对象o1中的strName没有指向任何内存空间,因此试图将数据拷贝到一个不存在的内存空间中,程序必然异常终止。所以“o1 = o2;”看上去合法,但实际上是不可行的。 C++还常用下列形式的初始化来将另一个对象作为对象的初值: 类名 对象名1(对象名2) 例如: CName o2(“DING”); // A:通过构造函数设定初值 CName o3(o2); // B:通过指定对象设定初值 B语句是将o2作为o3的初值,同o2一样,o3这种初始化形式要调用相应的构造函数,但此时找不到相匹配的构造函数,因为CName类没有任何构造函数的形参是CName类对象。事实上,CName还隐含一个特殊的默认构造函数,其原型为 CName(const CName ),这种特殊的默认构造函数称为默认拷贝构造函数。在C++中,每一个类总有一个默认拷贝构造函数,其目的是保证B语句中对象初始化形式的合法性,其功能就等价于“CName o3 = o2;”。但语句“CName o3(o2);”与语句“o1 = o2;”一样,也会出现程序终止,其原因和“o1 = o2;”原因一样。但是,若有类CData: class CData { public: CData( int data = 0) { m_nData = data; } ~CData() {} int getData() { return m_nData; } private: int m_nData; }; 则下列初始化形式却都是合法有效的: CData a(3); // 通过重载构造函数设定初值 CData b(a); // 通过默认拷贝构造函数设定初值, // 等价于 CData b = a; cout a.getData()endl; // 输出 3 cout b.getData()endl; // 输出 3 可见,同变量一样,在C++中类对象的初始化也可以有2种方式:赋值方式和默认拷贝方式。这两种方式是等价的,例如:CData b(a);和CData b = a;是等价的。 2. 分析和比较

您可能关注的文档

文档评论(0)

1亿VIP精品文档

相关文档