C++ Primer Plus 第十一章

C++ Primer Plus第六版第十一章使用类编程练习答案 1. main.cpp #include "Vector.h" #include<cstdlib> #include<ctime> #include<fstream> int main() { using namespace std; ofstream outFile; outFile.open("hello.txt"); using VECTOR::V... 阅读详情
//操作符重载
只能重载现有的操作符
操作符重载其实一种函数替换:如
district2 = sid + sara;
district2 = sid.operator()+(sara);     //隐式转换

ex:
mytime.h
class Time
{
private:
     ...
public:
     Time operator+(const Time &t) const;
     Time operator-(const Time &t) const;
     Time operator*(double n) const;
};
mytime.cpp
Time Time::operator+(const Time &t) const
{
     ...
     return time;          //直接return变量会在返回创建其拷贝,所以没有问题(但是应该注意浅拷贝问题),返回局部变量的引用或指针就会有问题
}
于是:
time t,t1,t2;
可以用下列方式调用
t = t1 + 2; <-----> t = t1.operator+(t2);

//重载限制
1 重载后的操作符必须至少有一个操作数是用户定义的类型,这将防止用户为标准类型重载操作符。(例如,不能将减法操作符重载为两个double值的和)
2 重载后的操作符不能违反操作符原来的句法规则,例如,不能将求模操作符% 重载成使用一个操作数(原来的求模操作符需要两个操作数)
3 重载后的操作符优先级不变
4 不能定义新的操作符
5 不能重载下面的操作符
     sizeof()
     .
     .*
     ::
     ?:
     typeid     RTTI操作符
     const_cast
     dynamic_cast
     reinterpert_cast
     static_cast
6 操作符重载可以通过成员函数(类函数)或普通函数重载,但下面的操作符只能通过成员函数重载
     =     赋值操作符
     ()     函数调用操作符
     []  下标操作符
     ->  通过指针访问类成员的操作符

//友元
友元有三种:
1 友元函数
2 友元类
3 友元成员函数
通过让函数成为类的友元,可以赋予该函数与类成员函数相同的访问权限

友元的用处
Time A,B
A = B*2.5;          //因为重载了 *所以,A=B*2.5 --> A.operator*(2.5)
A = 2.5*B;          //编译器无法重载
但是,通过编写普通函数重载--> Time operator*(double m, const Time &t)
A = 2.5*B          //A = 2.5*B --> operator*(2.5, B),但是,这样无法获取Time的私有成员(用友元解决)

加入友元函数
class Time
{
     ...
     friend Time operator*(double m, const Time &t);
     ...
};
友元函数不是Time类的成员函数,所以不加 Time:: 域名限定符
Time operator*(double m, const Time &t)
{
     ....
}

常用的友元:重载<<操作符,注意返回ostream以便实现 os << A << B 的效果
ostream& operator<< (ostream &os, const Time &t)
{
     ...
     return os;
}

NOTE:friend关键字在类成员函数的定义中使用
NOTE:如果你同时定义了相同调用格式的 类成员函数与非类成员函数,会导致编译错误

//类的自动转换盒强制转换
C++不自动转换不兼容类型
int *p = 10;     //type clash wrong!
int *p = (int *) 10 //right

自动转换构造函数
Stonewt(double lbs);
Stonewt myCat;
myCate = 19.6;     //将会自动调用Stonewt(double lbs)创建一个对象,并将其内容复制到myCat中
等价的
Stonewet myCat = 260; <---> Stonewet myCat(260); <---> Stonewet myCat = Stonewt(260);
explicit Stonewt(double lbs);     //关闭这种自动特性的隐式转换,不过仍可使用显式转换,如下:
myCate = (Stonewt)19.6;     //显式转换

隐式转换发生在如下场景:
1 将Stonewet初始化为double值时
2 将double值复制给Stonewet对象时
3 将double值传值给接受Stonewet参数的函数时
4 返回值声明为一个Stonewet的函数,返回一个都变了时

还可以进行如下转换:
Stonewet Jumbo;
JumBo = 7300;     //将7300的int型转换为double型,注意如果还有构造函数Stonewet Jumbo(long) 则因为int既可以转换为long,也可转换为double,因此调用存在歧义,编译错

//转换函数
使用转换函数将类类型转换为元类型(int ,double...)
转换函数如下声明
operator typeName();
StoneWet
{
     operator int();      // 替换为nt Stone_to_Int更安全;
}
StoneWet::operator int();
{
     return int (pounds + 0.5);
}
要注意以下几点:
1 转换函数必须是类方法
2 转换函数不能指定转换类型 //即连void都没有,但是却可以返回参数
3 转换函数不能有参数

//转换函数的缺点!如:
int ar[20];
...
Stonewet temp(14,4);
...
int Temp = 1;
...
cout << ar[tmep] << endl;     //这里的类类型temp将会转换为int值,编译器不会报错

转换总结:
1 只有一个参数的类构造函数会转换,可以用explicit防止隐式转换
2 operator int();可以将类类型转换为int型

两种转换函数可能会混乱!
total = stoenwet1 + stonewet2;    
可能的转换
1. stoenwet1.operator+(stonewet2);    
2. operator+(stoenwet1, stonewet2);    
3. 转换成double加法     //因为Stonewet有double构造函数,且定义了operator double()
//1,2会编译错;1,3 2,3则会混乱 vs会选择1,2
C Primer Plus (第六版) 第十一章_编程练习答案 no1.c //设计并测试一个函数,从输入中获取n个字符(包括空白,制表,换行符),把结果储存 //在一个数组里,他的地址被传递作为一个参数 # include <stdio.h> # include <string.h> # define SIZE 100 char * get_input(char * st , int size); int main(vo... 阅读详情

相关推荐

C++ Primer Plus 第六版课后习题答案(第十一章)

第一题: vector.h #ifndef VECTOR_H_ #define VECTOR_H_ #include <vector> namespace VECTOR { class Vector { public: enum Mode {RECT, POL}; private: double x; double y; double mag;

flannery023的博客 395

【C++ Primer Plus】第11章 使用类

运算符重载。 友元函数。 重载

chaiky的博客 1085

c++ Primer Plus(第六版)第十一章,编程练习之路

c++ Primer Plus(第六版)第十一章,个人学习记录,成长中

Robot_x的博客 2690

c++ Primer Plus 第十一章 答案

第1题 头文件和函数定义和原文相同 vector.h #ifndef VECTOR_H_ #define VECTOR_H_ #include <iostream> namespace VECTOR { class Vector { public: enum Mode { RECT, POL }; private: double x; double y; double mag; double ang; Mode mode; void set_mag();

weixin_45791686的博客 345

灵魂三问:因果推断

什么是因果推断?为什么研究因果推断?怎么进行因果推断研究?

ML OR 智能决策的博客 2902

反激变压器设计学习笔记

反激变压器匝比感量设计

m0_55419117的博客 5262

C++ primer plus 第六版 第十一章 复习题

第十一章 复习题 1. Stonewt Stonewt::operator*(double n) const { Stonewt result; double total = stn * Lbs_per_stn * n +lbs * n; result.stn = total / Lbs_per_stn; result.lbs = total % Lbs...

菜鸡harry的博客 1195

英飞凌 AURIX Development Studio工程移植到Hightec的方法

1. 软件简介 AURIX™ Development Studio是英飞凌针对AURIX TC2XX/TC3XX系列单片机推出了一款免费的软件,集成了iLLD库,内置Tasking compiler和Tasking Debugger,但这两个模块只能用于非商业用途,可供学习和试用。iLLD库是英飞凌为TC2XX和TC3XX Tricore系列单片机提供的底层驱动库,有完善的使用手册,和较好的移植性。 Hightec是一款可以用来开发Aurix系列单片机的编译器,有免费版,可商用,集成GCC编译器,可用UDE

weixin_42967006的博客 7136

C++primer plus 第十一章习题答案

第一题: // An highlighted block Stonewt operator*(double mult); Stonewt Stonewt::operator*(double mult) { return Stonewt(mult * pounds); } 第二题: 成员函数是类定义的一部分,通过特定的对象来调用。成员函数可以隐式访问调用对象的成员,而无需使用成员运算符。友元函数...

weixin_44808331的博客 609

开关电源PCB安规设计避坑指南:从光耦开槽到变压器挡墙,这些细节决定认证成败

本文深入解析开关电源PCB安规设计中的关键细节,包括光耦开槽、变压器挡墙工艺等12个致命要点。通过实际案例和工艺参数表,揭示如何避免认证失败,特别强调爬电距离和电气间隙的精确控制,助力工程师提升产品安全性和认证通过率。

weixin_42548893的博客 203

利用LDA进行主题建模,用困惑度和一致性曲线选取最优主题数

如果困惑度和一致性曲线效果图较好,确定了主题数量后,再单独跑一下2里面的程序。2中topic为5是我主观设置的,不一定为最优。

m0_56327159的博客 4223

C++ Primer Plus 学习笔记 第十一章 类的自动转换和强制类型转换 转换函数

先说下随机数rand() C++ 类的转换, 是指基本类型转换成类类型 构造函数添加对相应数据类型的参数 然后生成一个对象。 比如 class A aa.h class A { private: doube aaa; public: A(double x); } aa.cpp #include "aa.h" A::A(double x) { aaa ...

@凌晨三点半的博客 312

Python 爬虫实战:爬取豆瓣读书评论并分析

摘要:本文以豆瓣读书《活着》评论数据为例,详细讲解Python爬虫开发与文本分析全流程。首先通过requests库爬取评论数据,解决分页、反爬等问题;然后利用BeautifulSoup解析页面提取评论内容、评分等核心信息;最后结合jieba进行关键词提取、snownlp完成情感分析,并通过可视化展示结果。分析显示该书评分以5星为主(占比70%),正面评论达82%,核心关键词为"活着""余华""生命"。全文包含完整代码与详细解析,帮助读者掌握非结构化

2503_91057718的博客 1497

C primer plus(第六版)第十一章源代码

C primer plus(第六版)第十一章源代码 /* 11.1 */ #include<stdio.h> #define MSG "I am a symbolic string constant." #define MAXLENGTH 81 int main(void) { char words[MAXLENGTH] = "I am a string in an arr...

weixin_45638291的博客 1949

2023年全国职业院校技能大赛“信息安全管理与评估”-真题——赛题题目+答案解析

2023年全国职业院校技能大赛“信息安全管理与评估”-真题——赛题题目+答案解析

君逍遥o 6004

ArcGIS实验教程——实验二十五:大型商场选址经典案例

本实验基于ArcGIS平台进行商场选址分析,综合考虑道路、居民点、停车场和已有商场四个影响因素。通过缓冲区分析建立各要素的影响范围(道路50米、居民点100米、停车场100米、已有商场500米),采用叠加分析中的相交和擦除运算确定最优选址区域。实验建立了区位评价体系,通过属性赋值(1/-1)和联合运算生成综合评价结果,并实现分级可视化显示。注意事项包括距离参数设置对结果的影响以及正确选择空间分析工具。该流程为商业选址提供了科学的GIS解决方案。

智慧空间实验室 1万+

C Primer Plus(第六版)第十一章 编程练习答案

前言:这次感觉融起来了,各章的知识都有用到,不过这次时间隔的是够久的。 仅供参考,新手勿喷。 CH11Code answer 1: #include <stdio.h> #define SIZE 100 void s_gots(char *); int main(void) { char str[SIZE]; printf("Enter your string(enter q to quit):"); s_gots(str); printf("REVIEW:%s".

weixin_50166464的博客 924

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

C++ Primer Plus(第六版)第十一章课后习题

C++ Primer Plus(第六版)第三章课后习题 3.7.1 #include int main() { using namespace std; double height; const int change=12; int foot, inch; cout <<“Please enter your height:_______\b\b\b\b\b\b\b” ; cin &g...

Francis_U的博客 315

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

C++ Primer Plus 第六版第十一章编程练习答案

//question1 //vector.h #ifndef VECTOR_H #define VECTOR_H #include &lt;iostream&gt; namespace VECTOR { class Vector { public: enum Mode {RECT, POL}; private: ...

biubiu_buaa的博客 594

《C++ Primer Plus》第十一章——使用类(笔记)

只接收一个参数的构造函数定义了从参数类型到类类型的转换。:从类类型到参数类型的转换:必须是类方法,不能指定返回类型,不能有参数。所需要的形参数目少一个,因为其中一个操作数是被隐式地传递的调用对象”但在定义中不要加friend,也不需要加限定符(Time::)“将其原型放在类声明中,并在原型声明前加上。与操作符使用的操作数数目相同;限定了这种构造函数,则它只用于。

2403_86782268的博客 218

C++ Primer Plus习题及答案-第十一章

C++ Primer Plus习题及答案-第十一章 习题选自:C++ Primer Plus(第六版) 内容仅供参考,如有错误,欢迎指正 !

jianmo的博客 1003

C++ primer plus(6th) 第十一章习题答案

但请注意,使用magval()方法比定义该转换函数更符合逻辑。

weixin_43998711的博客 258

C++ Primer Plus 第六版 第十一章 编程题(上)

【代码】C++ Primer Plus 第六版 第十一章 编程题(上)

geesehoward20000的博客 290

C++ Primer Plus 第十一章知识点(一)

C++ Primer Plus 第十一章知识点简化1. 类的运算符重载2. 友元3. 友元的拓展 1. 类的运算符重载        对于重载(多态)之前也提到过,这一部分主要是讲述类的重载以及注意点。 #ifndef TIME_H_ #define TIME_H_ class Time{ private: int hours; int minutes; public: Time(); Time(int h, int m = 0

Raywit的博客 302

《Cpp-Primer-Plus》-第十一章 实用类

文章目录第十一章 使用类博文地址知识整理运算符重载友元类的自动转换和强制类型转换复习题 第十一章 使用类 记录CCPlus十一章内容,包含许多c++特性 博文地址 知识整理 运算符重载 运算符重载允许赋予c++运算符多种含义,c++根据操作数的数目和类型来决定采用哪种操作。 要重载运算符, 需使用运算符函数的特殊函数形式 operator op(argument list); 在运算符表示法中,运算符左侧的对象是调用对象,运算符右侧的对象是作为参数被传递的对象 c++对运算符重载的限制 重载后的运

小菜鸟博客 348

C++ Primer Plus第十一章复习题

答:成员函数是类定义的一部分,通过特定的对象来调用。成员函数可以隐式访问调用对象的成员,而无需使用成员运算符。友元函数不是类的组成部分,因此被称为直接函数调用。友元函数不能隐式访问类成员,而必须将成员运算符用于作为参数传递的对象。请比较复习题1和复习题4的答案。答:要访问私有成员,它必须是友元,但要访问公有成员,可以不是友元。这些运算符必须使用成员函数来定义。

weixin_46032775的博客 820
上一篇: C++ Pirmer Plus 第十章
下一篇: 深入理解计算机系统 第二章
外天楼
博客等级 码龄15年 6粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值