| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> C++知识库 -> 小技术回顾、队列模拟 -> 正文阅读 |
|
[C++知识库]小技术回顾、队列模拟 |
一、复习各种技术 ??1.重载<<运算符 ???? ostream & operator<<(ostream & os, const c_name & obj) ???? { ???????? os<< … ; //display object contents ???????? return os; ???? } 其中c_name是类名。 ?? 2.转换函数 ???? a.要将单个值转换为类类型,需要创建原型如下的类构造函数 : ???????? c_name (type_name value); ?????? 其中c_name是类名,type_name是要转换的类型的名称。 ???? b.要将类转换为其他类型,需要创建原型如下的类成员函数: ????????? operator type_name(); ??????? 虽然该函数没有声明返回类型,但应返回所需类型的值。 3.其构造函数使用new的类 如果类使用new运算符来分配类成员指向的内存,在设计时应采取一些预防措施: ? a. 对于指向的内存是由new分配的所有类成员,都应在类的析构函数中对其使用delete。 b. 如果析构函数通过对指针类成员使用delete来释放内存,则每个构造函数都应当使用new来初始化指针,或将其设置为空指针。 c. 构造函数中要么使用new[ ],要么使用new,而不能混用。若构造函数使用的new,则析构函数应使用delete[ ];若构造函数使用new,则析构函数应使用delete。 d. 应定义一个分配内存(而不是将指针指向已有内存)的复制构造函数。 ?4. 应定义一个重载赋值运算符的类成员函数,其函数定义如下(其中c_pointer是c_name的类成员,类型为指向type_name的指针)。下面示例假设使用new[ ]来初始化变量c_pointer: c_name & c_name::operator=(const c_name &cn) { ?if(this == & cn) Return * this; //done if self-assignment ????????????? delete [ ] c_pointer; ????????????? //set size number of type_name units to be copied ????????????? c_pointer = new type_name[size]; ????????????? //then copy data pointed to by cn.c_pointer to //location pointed to by c_pointre …… return *this; ???????????? } 二、 队列模拟 ???? 1. 链表由节点序列构成。每一个节点中都包含要保存到链表中的信息以及一个指向下一个节点的指针。通常,链表最后一个节点中的指针被设置为NULL(或0),在C++11中应使用新增的关键字nullptr。 ???? 2. 嵌套结构和类 ??????? 在类声明中声明的结构、类或枚举被称为是被嵌套在类中,其作用域为整个类。这种声明不会创建数据对象,而只是指定了可以在类中使用的类型。如果声明是在类的私有部分进行的,则只能在这个类使用被声明的类型;如果声明是在公有部分进行的,则可以从类的外部通过作用域解析运算符使用被声明的类型。 ? ???3. 对于类中const数据成员,必须在执行到构造函数体之前,即创建对象时进行初始化。成员初始化列表由逗号分隔的初始化列表组成(前面带冒号),它位于参数列表的右括号之后、函数体左括号之前。例如: ?????????? class Queue ?????????? { ??????????? private: ?????????????? const int qsize; ??????????? …… ?????????? } ?????????? Queue::Queue(int qs) : qsize(qs) //initialize qsize to qs ?????????? { ?????????????? front = rear = NULL; ?????????????? items = 0; ?????????? } ????? 通常,初值可以是常量或构造函数的参数列表中的参数,等同于: ?????????? Queue::Queue(int qs) : qsize(qs), front(NULL), rear(NULL), items(0) ?????????? { } ?????? 注意,只有构造函数可以使用这种初始化列表语法,对于const类成员和被声明为引用的类成员,必须使用这种语法。 ? 成员初始化列表的语法:如果Classy是一个类,而mem1、mem2和mem3都是这个类的数据成员,则类构造函数可以使用如下的语法来初始化数据成员: ?????????? Classy::Classy(int n, int m) : mem1(n), mem2(0), mem3(n*m+2) ?????????? { ???????????? //…… ?????????? } 上述代码将mem1初始化为n,将mem2初始化为0,将mem3初始化为n*m+2.从概念上说,这些初始化工作是在对象创建时完成的,此时还未执行括号中的任何代码。注意: ??????????????????????????????????????????????????????? a. 这种格式只能用于构造函数 b. 必须用这种格式来初始化非静态const数据成员(至少在C++11之前是这样的) c. 必须用这种格式来初始化引用数据成员 数据成员被初始化的顺序与它们出现在类声明中的顺序相同,与初始化器中的排列顺序无关。(警告:不能将成员初始化列表语法用于构造函数之外的其他类方法)。成员初始化列表使用的括号方式也可用于常规初始化。 4. 当对象被按值传递(或返回)时,复制构造函数将被调用,应遵循优先采用按引用传递对象的惯例。复制构造函数还被用于创建其他的临时对象。 5. C++逐个对成员进行初始化和赋值,这意味着被初始化或被赋值的对象的成员将与原始对象完全相同。如果原始对象的成员指向一个数据块,则副本成员将指向同一个数据块。当程序最终删除这两个对象时,类的析构函数将试图删除同一个内存数据块两次,这将出错。解决方法是:定义一个特殊的复制构造函数来重新定义初始化,并重载赋值运算符。 6. 如果使用了定位new运算符(而不是常规new运算符)为类对象分配内存,则必须负责显式地为该对象调用析构函数,方法是使用指向该对象的指针调用析构函数方法。 |
|
C++知识库 最新文章 |
【C++】友元、嵌套类、异常、RTTI、类型转换 |
通讯录的思路与实现(C语言) |
C++PrimerPlus 第七章 函数-C++的编程模块( |
Problem C: 算法9-9~9-12:平衡二叉树的基本 |
MSVC C++ UTF-8编程 |
C++进阶 多态原理 |
简单string类c++实现 |
我的年度总结 |
【C语言】以深厚地基筑伟岸高楼-基础篇(六 |
c语言常见错误合集 |
|
上一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年3日历 | -2025/3/4 11:08:01- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |