C++ Primer Plus学习笔记之对象和类

2023-01-04 0 711

C++ Primer Plus学习笔记之对象和类

序言

对个人真的自学程式设计最有效率的形式是写作专精的书刊,透过写作辅助工具书可以构筑更为管理体系化的科学知识管理体系。 始终年来都很想深入细致自学呵呵C++,将其做为他们的主力部队合作开发词汇。那时为的是顺利完成他们这始终年来的愿望,预备认真自学《C++ Primer Plus》。 为的是提升自学工作效率,在自学的操作方式桑利县透过正式发布自学讲义的形式,稳步历史记录他们自学C++的操作方式过程。

一、操作方式过程性程式设计和面向第一类程式设计

选用操作方式过程性程式设计形式时,具体来说考量要遵从的步骤,接着考量怎样表示这些统计数据(无须流程始终运转,采用者可能期望能将统计数据储存在三个文档中,接着从这个文档中读取统计数据)。

选用OOP形式时,具体来说从采用者的视角考量第一类——叙述第一类所需的统计数据和叙述采用者与教据可视化所需的操作方式。顺利完成对USB的叙述后,须要确认怎样同时实现USB和统计数据储存。最终,采用捷伊设计图建立出流程。

二、抽象化和类

2、C++中的类

类是一类将抽象化切换为采用者表述类别的C++辅助工具,它将统计Luzy和操纵者统计数据的形式组合而成三个干净的包。

接下去表述类。一般而言,类规范化由三个部份共同组成:

类新闻稿:以统计数据核心成员的形式叙述统计数据部份,以核心成员表达式(被称作形式)的形式插述私有USB

类形式表述:叙述怎样同时实现类核心成员表达式。 简单地说,类新闻稿提供了类的蓝图,而形式表述则提供了细节。

USB是三个共享框架,供三个系统(如在计算机和打印机之间或者采用者或计算机流程之间)可视化时采用。

要采用某个类,必须了解其公共USB;要编写类,必须建立其公共USB。

通常,C++将USB(类表述)放在头文档中,并将同时实现(类形式的代码)放在源代码文档中。

// stock00.h — Stock class interface// version 00#ifndef STOCK00_H_#define STOCK00_H_#include <string>class Stock // class declaration{private: std::string company; long shares; double share_val; double total_val; void set_tot() { total_val = shares * share_val; }public: void acquire(const std::string & co, long n, double pr); void buy(long num, double price); void sell(long num, double price); void update(double price); void show();}; // note semicolon at the end#endif

关键字privatepublic叙述了对类核心成员的访问控制。采用类第一类的流程都可以直接访问共有部份,但只能透过共有核心成员表达式(或友元表达式)来访问第一类的私有核心成员。防止程序直接访问统计数据被称作统计数据隐藏。C++还提供了第三个访问控制关键字protected

可以在类新闻稿中省略关键字private,因为这是类第一类默认访问控制:

class World{ float mass;//默认private char name[20];//默认privatepublic: void tellall(void);}

3、同时实现类核心成员表达式

核心成员函救表述与常规表达式表述非常相似,它们有表达式头和函数体,也可以有返回类别和参数。但是它们还有三个特殊的特征:

表述核心成员表达式时,采用作用域解析运算符(::)来标识表达式所属的类;

类形式可以访同类的private组件。

// stock00.cpp — implementing the Stock class// version 00#include <iostream>#include “stock00.h”void Stock::acquire(const std::string & co, long n, double pr){ company = co; if (n < 0) { std::cout << “Number of shares cant be negative; ” << company << ” shares set to 0.\n”; shares = 0; } else shares = n; share_val = pr; set_tot();}void Stock::buy(long num, double price){ if (num < 0) { std::cout << “Number of shares purchased cant be negative. ” << “Transaction is aborted.\n”; } else { shares += num; share_val = price; set_tot(); }}void Stock::sell(long num, double price){ using std::cout; if (num < 0) { cout << “Number of shares sold cant be negative. ” << “Transaction is aborted.\n”; } else if (num > shares) { cout << “You cant sell more than you have! ” << “Transaction is aborted.\n”; } else { shares -= num; share_val = price; set_tot(); }}void Stock::update(double price){ share_val = price; set_tot();}void Stock::show(){ std::cout << “Company: ” << company << ” Shares: ” << shares << \n << ” Share Price: $” << share_val << ” Total Worth: $” << total_val << \n;}

在OOP中,调用核心成员表达式被称作发送消息,因此将同样的消息发送给三个不同的对象将调用同三个形式,但该形式被用于三个不同的第一类。

要建立类第一类,可以新闻稿类变量,也可以采用new为类第一类分配储存空间。可以将第一类做为表达式的参数和返回值,也可以将三个第一类赋给另三个。

那时我们透过如下代码来采用类:

// usestok0.cpp — the client program// compile with stock.cpp#include <iostream>#include “stock00.h”int main(){ Stock fluffy_the_cat; fluffy_the_cat.acquire(“NanoSmart”, 20, 12.50); fluffy_the_cat.show(); fluffy_the_cat.buy(15, 18.125); fluffy_the_cat.show(); fluffy_the_cat.sell(400, 20.00); fluffy_the_cat.show(); fluffy_the_cat.buy(300000,40.125); fluffy_the_cat.show(); fluffy_the_cat.sell(300000,0.125); fluffy_the_cat.show(); // std::cin.get(); return 0;}

接着透过g++进行编译,编译语句:

g++ -fexec-charset=gbk -o E:\usertok0 E:\usertok0.cpp E:\stock00.cpp

流程运转结果如下:

Company: NanoSmart Shares: 20 Share Price: $12.5 Total Worth: $250Company: NanoSmart Shares: 35 Share Price: $18.125 Total Worth: $634.375You cant sell more than you have! Transaction is aborted.Company: NanoSmart Shares: 35 Share Price: $18.125 Total Worth: $634.375Company: NanoSmart Shares: 300035 Share Price: $40.125 Total Worth: $1.20389e+07Company: NanoSmart Shares: 35 Share Price: $0.125 Total Worth: $4.375

典型的类别新闻稿格式如下:

class ClassName{private: data member declarationspublic: member function prototypes};

三、类的构造表达式和析构表达式

C++提供了三个特殊的核心成员表达式——类构造表达式,专门用于构造新第一类、将值赋给它们的统计数据核心成员。构造表达式的原型和表达式名虽然没有返回值,但没有被新闻稿为void类别。实际上,构造表达式没有新闻稿类别。

新闻稿三个构造表达式示例如下:

Stock(const std::string & co, long n = 0, double pr = 0.0);

对构造表达式进行表述:

Stock::Stock(const std::string & co, long n, double pr){ company = co; if (n < 0) { std::cout << “Number of shares cant be negative; ” << company << ” shares set to 0.\n”; shares = 0; } else shares = n; share_val = pr; set_tot();}

上述代码和本章前面的表达式acquire()相同。区别在于,流程新闻稿第一类时,将自动调用构造表达式。

接下去我们采用构造表达式:

Stock food = Stock(“World”, 250 , 1.24);

这条语句与下面的等价:

Stock food(“World”, 250 , 1.24);

每次建立第一类(甚至采用new动态分配内存)时,C++都采用类构造表达式。下面是将构造表达式与new一起采用的形式:

Stock stock = new Stock(“Ele” , 18 , 19.0);

构造表达式被用来建立第一类,而不能透过第一类来调用。

默认构造表达式是在未提供显式初始值时,用来建立第一类的构造表达式。

对于Stock类来说,默认构造表达式可能如下:

Stock::Stock(){ }

默认构造表达式没有参数,因为新闻稿中不包含值。

当且仅当没有表述任何构造表达式时,编译器才会提供默认构造表达式。因此,为类表述了构造表达式后,就必须为它提供默认构造表达式。 在设计类时,通常应提供对所有类核心成员做隐式初始化的默认构造表达式。 隐式地调用默认构造表达式时,不要采用圆括号。

用构造表达式建立第一类后,流程负责跟踪该第一类,直到其过期为止。第一类过期时,流程将自动调用析构表达式。 析构表达式须要在类名前加上~。析构表达式没有参数,因此Stock析构表达式的原型必须是这样的:

~Stock();

什么时候应调用析构表达式由编译器决定,通常不应在代码中显式地调用析构表达式。

如界建立的是静态储存类第一类,则其析构表达式在流程结柬时自动被调用。

如果建立的是自动储存类第一类,则其析构表达式将在流程执行完代码块时(该第一类是在其中表述的)自动被调用。

如果第一类是透过new建立的,则它将驻留在栈内存或自由储存区中,当采用delete来释放内存时,其析构表达式将自动被调用。

最终,流程可以建立临时第一类来顺利完成特定的操作方式,在这种情况下,流程将在结束对该第一类的采用时自动调用其析构表达式。

由于在类第一类过期时析构表达式将自动被调用,因此必须有三个析构表达式。如果流程员没有提供析构表达式编译器将隐式地新闻稿三个默认析构表达式,并在发现导致第一类被删除的代码后,提供默认析构表达式的表述。

C++引入了一类捷伊语法,保证表达式不会修改调用第一类,即将const关键字放在表达式的括号后面,例如:

void Show() const;

四、this指针

this指针指向用来调用核心成员表达式的第一类(this被做为隐藏参数传递给形式)。一般而言,所有的类形式都将this指针设置为调用它的第一类的地址。

五、第一类数组

新闻稿第一类数组的形式和新闻稿标准类别数组相同:

Stock mystuff[4];

六、类作用域

在类中表述的名称(如类统计数据核心成员名和类核心成员表达式名)的作用域都为整个类,作用域为整个类的名称只在该类中是已知的,在类外是不可知的。因此,可以在不同类中采用相同的类核心成员名而不会引起冲突。另外,类作用域意味着不能从外部直接访问类的核心成员,私有核心成员表达式也是如此。也就是说,要调用私有核心成员表达式,必须透过第一类。

C++提供了另一类在类中表述常量的形式——采用关键字static

class Stock{private: static const int M_Count = 100;…}

这将建立三个名为M_Count的常量,该常量将与其他静态变量储存在一起,而不是储存在第一类中。

C++ 提供了一类新没,其枚举量的作用域为类:

enum class egg {Small, Big};

也可以采用关键字struct代替class。接着采用枚举名来限定枚举量:

egg choice = egg::Small;

七、抽象化统计数据类别

类很适合用于叙述ADT(abstract data type, ADT)。私有核心成员表达式USB提供了ADT叙述的服务,类的私有部份和类形式的代码提供了同时实现、这些同时实现对类的客户隐藏。

举报/反馈

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务