
C++ Primer Plus
文章平均质量分 81
阳光开朗男孩
躺平才是王道
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
12.6 复习各种技术
5)应定义一个重载赋值运算符的类成员函数,其函数定义如下(其中c_pointer是c_name的类成员,类型为指向type_name的指针)。如果该类提供了能够返回所需内容的公有方法,则可在运算符函数中使用这些方法,这样便不用将它们设置为友元函数了。2)如果析构函数通过对指针类成员使用delete来释放内存,则每个析构函数都应当使用new来初始化指针,或将它设置为空指针。1)对于指向的内存是由new分配的所有类成员,都应在类的析构函数中对其使用delete,该运算符将释放分配的内存。使用转换函数时要小心。原创 2024-05-26 23:15:52 · 317 阅读 · 0 评论 -
多重继承(MI)
worker0.h#ifndef WORKER0_H_#define WORKER0_H_#include <string>class Worker{private: std::string fullname; long id;public: Worker() : fullname("no one"), id(0L) {} Worker(const std::string & s, long n) : fullname(s), id(n) {} virtu原创 2021-12-14 16:42:21 · 1429 阅读 · 0 评论 -
13.7 继承和动态内存分配
派生类不使用new假设基类使用了动态内存分配:class baseDMA{private: char * label; int rating;public: baseDMA(const char * l = "null", int r = 0); baseDMA(const baseDMA & rs); virtual ~baseDMA(); baseDMA & operator=(const baseDMA & rs); ...};声明中包含了构造函原创 2021-11-08 16:02:39 · 226 阅读 · 0 评论 -
私有继承,
私有继承C++还有另一种实现 has-a关系的途径一私有继承。 使用私有继承,基类的公有成员和保护成员都将成为派生类的私有成员。这意味若基类方法将不会成为派生对象公有接口的一部分,但可以在派生类的成员函数中使用它们。公有继承,基类的公有方法将成为派生类的公有方法,派生类将将继承基类的接口。私有继承,基类的公有方法将成为派生类的私有方法,派生类不继承基类的接口。私有继承提供的特性与包含相同:获得实现,但不获得接口。Student类范例要执行私有继承,请使用关键字private而不是public来定原创 2021-11-30 17:27:41 · 727 阅读 · 0 评论 -
包含对象的成员类
Student类将学生简化成姓名和一组考试分数后,可以使用一个包含两个成员的类来表示它:一个成员用于表示姓名,另一个成员用于表示分数。对于姓名,可以使用字符数组束表示,但这将限制姓名的长度。当然,也可以使用char指针和动态内存分配,然而正如第12章指出的,这将要求提供大量的支持代码。-种更好的方法是,使用一个由他人开发好的类的对象来表示。例如,可以使用一个String类(参见第12章)或标准C++的string 类的对象来表示姓名。较简单的选择是使用string 类,因为C++库提供了这个类的所有原创 2021-11-10 10:24:37 · 990 阅读 · 0 评论 -
13.6 抽象基类ABC
Ellipse类开发一个图形程序,显示圆和椭圆。圆是椭圆的一个特殊情况,长轴和短轴等长的椭圆,因此,所有的圆都是椭圆,可以从Ellipse类派生出Circle类。数据成员包括椭圆中心的坐标、半长轴、短半轴、方向角。还包括一些移动椭圆、返回椭圆面积、旋转椭圆、缩放长半轴和短半轴方法。class Ellipse{private: double x; //椭圆中心x坐标 double y; //椭圆中心y坐标 double a; //半长轴 double b; //短半轴 double angl原创 2021-11-08 11:26:07 · 216 阅读 · 0 评论 -
13.5 访问控制:protected
protected在类外只能用公有类成员来访问protected部分中的类成员。派生类的成员可以直接访问基类的保护成员,但不能直接访问基类的私有成员。对于外部世界来说,保护成员的行为与私有成员相似;对于派生类来说,保护成员的行为与公有成员相似。Brass类将balance成员声明为保护的class Brass{protected: double balance;...};这种情况下,BrassPlus类可以直接访问balance,而不需要使用Brass方法。可以这样编写Bras原创 2021-11-05 10:13:33 · 674 阅读 · 0 评论 -
13.4 静态联编和动态联编
标题原创 2020-12-19 01:33:21 · 764 阅读 · 1 评论 -
13.3 多态公有继承
多态多态:具有多种形态,同一个方法在派生类和基类的行为是不同的,随上下文而异。实现多态公有继承的两种机制:在派生类中重新定义基类的方法使用虚方法虚方法虚方法:带关键字virtual在基类中将派生类会重新定义的方法声明为虚方法。使用了virtual,程序将根据引用或指针指向的对象的类型来选择方法虚析构函数基类要声明一个虚析构函数,为了确保释放派生类对象时,按正确的顺序调用析构函数实例银行开发两个类,Brass Account:用于表示基本支票账户,Brass Plus:用于表示支票原创 2020-12-18 17:32:07 · 412 阅读 · 0 评论 -
13.2 继承:is-a关系
is-a公有继承:is-a关系,派生类对象也是一个基类对象,可以对基类对象执行的任何操作,也可以对派生类对象执行。原创 2020-12-18 09:59:14 · 283 阅读 · 0 评论 -
13.1 一个简单的基类
基类基类:从一个类派生出另一个类时,原始类称为基类。派生类:继承类称为派生类。设计一个乒乓球类//tabtenn0.h#ifndef TABTENN0_H#define TABTENN0_H#include <string>using namespace std;class TableTennisPlayer{private: string firstname; //姓名 string lastname; bool hasTable; //是否有球桌public:原创 2020-12-17 18:24:17 · 819 阅读 · 0 评论 -
类继承
类继承类继承:从已有的类派生出新的类,而派生类继承了原有类(基类)的特征及方法。可以在已有类的基础上添加功能可以给类添加数据可以修改类方法的行为原创 2020-12-17 14:52:08 · 106 阅读 · 0 评论 -
12.7 队列模拟
ATM问题Heapther银行在Food Heap超市开设一个ATM。Food Heap超市担心排队等待使用ATM的人流会干扰超市的交通,希望限制排队等待的人数。Heapther银行希望对顾客排队等待的时间进行估测。队列是一种抽象的数据类型,可以存储有序的项目序列。新项目被添加在队尾,并可以删除队首的项目。栈在同一端进行添加和删除,后进先出。队列是先进先出。队列中的项目是顾客。1/3的顾客只需要一分钟便可获得服务,1/3的顾客需要两分钟,另外1/3的顾客需要三分钟。顾客到达的时间是随机的,但每小时使用原创 2021-08-21 16:57:57 · 734 阅读 · 0 评论 -
12.5 使用指向对象的指针
#include <iostream>#include <cstdlib>#include <ctime>#include "string1.h"const int ArSize = 10;const int MaxLen = 81;int main(){ String name; cout << "Hi, What's your name?\n>> "; cin >> name; cout << n原创 2021-08-19 18:30:15 · 462 阅读 · 0 评论 -
12.4 有关返回对象的说明
返回指向const对象的引用使用const引用的常见原因是旨在提高效率,但对于何时可以采用这种方式存在一些限制。如果函数返回(通过调用对象的方式或将对象作为参数)传递给它的对象,可以通过返回引用来提高其效率。假设要编写函数Max(),它返回两个Vector对象中较大的一个,该函数将以下面方式被使用:...原创 2021-08-18 09:43:13 · 223 阅读 · 0 评论 -
12.3 在构造函数中使用new时应注意的事项
在构造函数中使用new时应注意的事项使用new初始化对象的指针成员时必须特别小心。● 如果在构造函数中使用new来初始化指针成员,则应该在析构函数中使用delete。● new和delete必须相互兼容。new对应于delete,new[]对应于delete[]。● 如果有多个析构函数,则必须以相同的方式使用new,要么都带中括号,要么都不带。因为只有一个析构函数,所有的构造函数都必须与它兼容。然而,可以在一个构造函数中使用new初始化指针,而在另一个构造函数中将指针初始化为空,这是因为delete原创 2021-08-17 18:41:04 · 878 阅读 · 0 评论 -
12.2 改进后的新String类
改进后的新String类对StringBad类进行修订,将它重命名为String了。首先,添加了复制构造函数和赋值运算符,使类能够正确管理类对象使用的内存。其次,由于知道对象何时被创建和释放,因此可以让类构造函数和析构函数保持沉默,不再每次被调用时都显示消息。另外,也不再监视构造函数的工作情况,因此可以简化默认构造函数,使之创建一个空字符串,而不是C++。接下来,可以在类中添加一些新功能。String类应该包含标准字符串函数库cstring的所有功能,才会比较有用,但这里只添加足以说明其工作原理的功能:原创 2021-08-09 18:20:04 · 196 阅读 · 0 评论 -
12.1 动态内存和类
类和动态内存分配在类构造函数中使用new运算符在程序运行时分配所需的内存。所有的构造函数与new析构函数协调一致、编写额外的类方法来帮助正确完成初始化和赋值,否则,在类构造函数中使用new将导致新问题。静态类成员静态类成员有一个特点:无论创建了多少对象,程序都只创建一个静态类变量副本。类的所有对象共享同一个静态成员,就像家中的电话可供全体家庭成员共享一样。不能在类声明中初始化静态成员变量,可以在类声明之外使用单独的语句来进行初始化。因为静态类成员是单独存储的,而不是对象的组成部分。初始化语句指出类原创 2021-07-21 11:08:10 · 287 阅读 · 0 评论 -
11.6 类的自动转换和强制类型转换
类型转换将一个标准类型变量的值赋值给另一种标准类型的变量时,如果这两种类型兼容,则C++自动将这个值转换为接收变量的类型。long count = 8; //int类型转换为long类型double time = 11; //int类型转换为double类型int side = 3.33; //double类型转换为int类型在C++各种数值类型都表示相同的东西,一个数字,同时C++包含用于进行转换的内置规则。C++语言不自动转换不兼容的类型:int *p = 10; //错误左边是指针原创 2021-07-16 18:49:02 · 794 阅读 · 0 评论 -
11.5 再谈重载:一个矢量类
矢量用户修改了矢量的一种表示后,对象将自动更新另一种表示。使对象有这种智能。该清单将类声明放在VECTOR名称空间中。该程序使用枚举创建两个常量(RECT和POL),用于标识两种表示法。vector.h#ifndef VECTOR_H#define VECTOR_H#include <iostream>using namespace std;namespace VECTOR{ class Vector { public: enum Mode原创 2021-07-10 19:02:39 · 495 阅读 · 0 评论 -
11.4 重载运算符:作为成员函数还是非成员函数
非成员函数应是友元函数,这样它才能直接访问类的私有数据。Time operator+(const Time &t) const; //成员函数也可以使用下面原型:friend Time operator+(const Time &t1, const Time &t2); //友元加法运算符需要两个操作数。对于成员函数版本来说,一个操作数通过this指针隐式传递,另一个操作数作为函数参数显式地传递;对于友元版本来说,两个操作数都作为参数来传递。注意:非成员版本的重载运算符原创 2021-07-10 12:21:42 · 582 阅读 · 0 评论 -
11.3 友元
友元C++控制对类对象私有部分的访问,公有类方法提供唯一的访问途径。这种限制太严格。C++提供另一种形式的访问权限:友元。● 友元函数● 友元类● 友元成员函数为何需要友元在为类重载二元运算符时(带两个参数的运算符)常常需要友元。将Time对象乘以实数就属于这种情况。乘法运算符与其他两种重载运算符的差别:它使用了两种不同的类型。加法和减法运算符都结合两个Time值,而乘法运算符将一个Time值与一个double值结合在一起。这限制了该运算符的使用方式。左侧的操作数是调用对象。A = B *原创 2021-07-08 23:44:44 · 254 阅读 · 0 评论 -
11.2 计算时间:一个运算符重载示例
题目今天早上在Priggs的账户上花费2小时35分钟,下午又花费了2小时40分钟,则总共花了多少时间。mytime0.h#ifndef MYTIME0_H#define MYTIME0_Hclass Time{private: int hours; int minutes;public: Time(); Time(int h, int m = 0); void AddMin(int m); //分钟相加 void AddHr(int h);原创 2021-07-07 23:09:36 · 484 阅读 · 0 评论 -
11.1 运算符重载
运算符重载函数重载:用户能够定义多个名称相同但特征标(参数列表)不同的函数的。C++运算符已经被重载。例如,将*运算符用于地址中的值;但将它用于两个数字时,得到的将是它们的乘积。C++允许将运算符重载扩展到用户定义的类型。例如,允许使用+将两个对象相加。编译器将根据操作数的数目和类型决定使用哪种加法定义。重载运算符可使代码看起来更自然。例如,将两个数组相加是一种常见的运算。for(int i = 0; i < 20; i++) evening[i] = sam[i] + janet原创 2021-07-07 22:18:47 · 149 阅读 · 0 评论 -
10.7 抽象数据类型
抽象数据类型抽象数据类型:以通用的方式描述数据类型,而没有引入语言或实现细节。栈通过使用栈来存储数据,从栈顶添加或删除数据。C++用栈来管理自动变量。当新的自动变量被生成后,它们被添加到栈顶,消亡时,从栈中删除它们。栈的特征:● 可创建空栈● 可将数据项添加到栈顶(压入)● 可从栈顶删除数据项(弹出)● 可查看栈是否填满● 可查看栈是否为空将上述描述转换为一个类声明,其中公有成员函数提供了表示栈操作的接口,而私有数据成员负责存储栈数据。私有部分必须表明数据存储方式。例如,使用常规数组、原创 2021-07-04 15:27:49 · 266 阅读 · 0 评论 -
10.6 类作用域
类作用域在类中定义的名称(类数据成员名和类成员函数名)的作用域都为整个类,作用域为整个类的名称只在该类中是已知的,在类外是不可知的。在不同类中使用相同的类成员名而不会引起冲突。例如,Stock类的shares成员不同于JobRide类的shares成员。类作用域不能从外部直接访问类的成员,公有成员函数也如此,调用公有成员函数,必须通过对象:Stock sleeper("Exclusive Ore", 100, 0.25); //创建对象sleeper.show(); //利用对象调用成员函数sho原创 2021-07-04 14:16:24 · 1340 阅读 · 0 评论 -
10.5 对象数组
对象数组用户通常要创建同一个类的多个对象,可以创建独立对象变量,但创建对象数组更合适。声明对象数组:Stock mystuff[4]; //创建一个包含 4 个 Stock 对象数组当程序创建未被显式初始化的类对象时,总是调用默认构造函数。上述声明,这个类要么没有显式定义任何构造函数(将使用不执行任何操作的隐式默认构造函数),要么定义了一个显式默认构造函数。每个元素(mystuff[0]、mystuff[1]等)都是Stock对象,可以使用Stock方法:mystuff[0].update()原创 2021-07-03 22:55:37 · 2061 阅读 · 0 评论 -
10.4 this指针
什么时候用this指针到目前为止,每个类成员函数都只涉及一个对象,即调用它的对象。但有时候方法可能涉及到两个对象,需要使用this指针。遇到的问题Stock类中,show()的输出可以知道持有的哪一支股票价格最高,但由于程序无法直接访问total_val,因此无法作出判断。通过内联函数,让方法返回一个值,让程序知道存储的数据。class Stock{private: ... double total_val; ...public: double total()原创 2021-07-03 00:56:53 · 185 阅读 · 1 评论 -
10.3 类的构造函数和析构函数、默认构造函数
声明和定义构造函数构造函数:专门用于构造新对象、将值赋给它们的数据成员。由于Stock对象提供3个值,因此应为构造函数提供3个参数。Stock(const string &co, long n = 0, double pr = 0.0)第一个参数:指向字符串的指针,用于初始化成员company。n和pr参数为shares和share_val成员提供值。注意:没有返回值,原型位于类声明的公共部分。Stock::Stock(const string &co, long n, dou原创 2020-12-15 18:40:01 · 3234 阅读 · 3 评论 -
10.2 抽象与类
引言将问题的本质特征抽象出来,并根据特征来描述解决方案,接口描述用户如何初始化、更新、和显示数据。抽象:通往用户定义类型的捷径。用户定义类型:实现抽象接口的类设计。接口接口:一个共享框架,供两个系统交互时使用。程序接口将你的意图转换为存储在计算机中的具体信息。公共接口:对于类来说,公共是使用类的程序,交互系统由类对象组成,而接口由编写类的人提供方法组成。接口让程序员能够编写与类对象交互的代码,从而让程序能够使用类对象。计算string对象包含多少个字符,无需打开对象,只需使用string类原创 2020-12-15 16:39:21 · 263 阅读 · 0 评论 -
对象和类
面向对象编程面向对象编程特性:抽象封装和数据隐藏多态继承代码的可重用性过程性编程和面向对象编程过程性编程:考虑要遵循的步骤考虑如何表示这些数据面向对象编程:用户的角度考虑对象描述对象所需的数据描述用户与数据交互所需的操作完成对接口的描述需要确定如何实现接口和数据存储使用新的设计方案创建出程序...原创 2020-12-15 09:37:47 · 125 阅读 · 0 评论 -
rand()与srand()
rand()rand()函数用来产生随机数,但是,rand()的内部实现是用线性同余法实现的,是伪随机数,由于周期较长,因此在一定范围内可以看成是随机的。rand()会返回一个范围在0到RAND_MAX(至少是32767)之间的伪随机数(整数)。在调用rand()函数之前,可以使用srand()函数设置随机数种子,如果没有设置随机数种子,rand()函数在调用时,自动设计随机数种子为1。随机种子相同,每次产生的随机数也会相同。rand()函数需要的头文件是:<stdlib.h>rand原创 2020-12-23 09:58:00 · 1032 阅读 · 0 评论 -
enum
晚上记得回去补原创 2020-12-22 14:45:33 · 177 阅读 · 1 评论 -
getline
cin虽然可以使用 cin 和 >> 运算符来输入字符串,但它可能会导致一些需要注意的问题。当 cin 读取数据时,它会传递并忽略任何前导白色空格字符(空格、制表符或换行符)。一旦它接触到第一个非空格字符即开始阅读,当它读取到下一个空白字符时,它将停止读取。以下面的语句为例:cin >> namel;可以输入 “Mark” 或 “Twain”,但不能输入 “Mark Twain”,因为 cin 不能输入包含嵌入空格的字符串。下面程序演示了这个问题:#include <原创 2020-12-06 21:43:27 · 152 阅读 · 0 评论 -
main函数
进入C++c++对大小写敏感,也就是说区分大小写字符。注释,由前缀//标识预处理器编译指令#include函数头:int main()编译指令:using namespace函数体,用{和}括起来使用c++对cout工具显示消息的语句结束main()函数的return语句输入// myfirst.cpp#include <iostream> // 预处理器编译指令int main() // 函数头{ // 功能主体的开始 using namespace st原创 2020-07-20 23:10:25 · 208 阅读 · 0 评论 -
C++ 指针的危险
C++中创建指针时,计算机将分配用来存储地址的内存,但不会分配用来存储指针所指向的数据的内存long *fellow; // 声明指向long的指针*fellow = 223323; // 将值存放在未被使用的地址上fellow是个指针,但没有初始化,所以它可能有任何值,可程序却将它解释为存储223323的地址。若fellow的值是1200,则计算机将数据存放在地址1200上,但很有可能不是存储数据223323的地址,就会导致bug变得最隐蔽,最难跟踪指针一定要初始化...原创 2020-06-28 23:07:28 · 2610 阅读 · 0 评论 -
C++ 指针
指针声明及初始化指针声明必须指定指针指向的数据的类型例:int p_updates;p_updates的类型为int。即p_updates是指针(地址),而p_updates是int,而不是指针。int是一种类型——指向int的指针*ptr是一个int类型的值double *tax_ptr;char *str;tax_ptr和str指向两种长度不同的数据类型,但这个两个变量本身的长度通常是相同的。即char的地址长度与double的地址长度相同。地址长度或值不能指示关于变量的长度或类型的任原创 2020-06-28 22:54:59 · 129 阅读 · 0 评论 -
C++ 一个简单的基类
继承可在已有类的基础上添加功能可给类添加数据可修改类方法的行为从一个类派生出另一个类时,原始类称为基类,继承类成为派生类Webtown俱乐部决定跟踪乒乓球会员,设计一个简单的TableTennisPlayer类tabtenn0.h#ifndef TABTENN0_H_#define TABTENN0_H_#include <string>using std::string;class TableTennisPlayer{private: string fi原创 2020-06-25 23:24:05 · 854 阅读 · 0 评论 -
C++ 整型变量
变量名只能用字母、数字、下划线第一个字符不能是数字区分大小写不能使用关键字整型short 16位int 32位long 32位long long 64位limits.cpp#include <iostream>#include <climits> // 定义了符号常量来表示类型的限制using namespace std;int main(){int n_int = INT_MAX; /原创 2020-06-23 23:04:33 · 1446 阅读 · 0 评论