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

数学建模——相关系数(4)——斯皮尔曼相关系数(spearman)

文章目录引述斯皮尔曼相关系数(spearman)定义 引述 经过之前几节的学习,我们了解并掌握了皮尔逊相关系数。在学习中我们发现,皮尔逊相关系数的使用条件相当苛刻:两组变量必须是连续数据、呈现正态分布,且两者间必须成线性关系。如果我们在数学建模中拿到一组数据无法满足以上条件,那么有没有其他的方法去判断两组变量之间的相关性呢?答案是肯定的,它就是斯皮尔曼相关系数(spearman). 斯皮尔曼相关系...

东 6万+

MCNP 减方差技巧(最全)

MCNP的减方差技巧,核心在于不显著增加计算时间的前提下,通过修改模拟过程来降低结果的统计误差。尤其适用于,这类问题中粒子很难到达探测器区域,直接模拟效率极低栅元重要性是常用的减方差技巧,该方法主要对计算模型的不同区域定义不同的重要性数值。当粒子从重要性低的区域废物重要性高的区域,产生更多粒子,增大统计量;当从重要性高的区域进入重要性低的区域,会进行,增快计算效率。n= 中子,N;光子,P;电子 Exi= 栅元i的重要性I=栅元总数项目IMP卡是必须的,除非使用了WWN卡如果粒子进入0。

chencheng1127的博客 926

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

systrace分析 之 问题初步定位

如下surfaceflinger空缺点,上面对应的bufferTX 中有buffer,但VSYNC-SF 过来后,SurfaceFlinger却没有去取,检查测试app “android.settings”, 也没有GPU completion 时间长的问题,所以该部分可以请SurfaceFlinger的owner 进一步确认为何不取buffer。. GPU拿的是acquireFence HWC拿的是releaseFence, GPU是绘图,HWC是合成显示,这两个是互相等待的关系,

yangzex的专栏 3195

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

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

weixin_44808331的博客 609

34、Text2KGBench与GeoQuestions1089:知识图谱生成与地理空间问答的新进展

本文介绍了Text2KGBench和GeoQuestions1089在知识图谱生成与地理空间问答领域的最新进展。Text2KGBench提供了一个开放且可复现的基准,用于从文本生成知识图谱,并结合多个LLM模型和评估工具推动研究。GeoQuestions1089是目前最大的地理空间问答数据集,与GeoQA2系统结合,推动了地理空间问答系统的发展。文章还探讨了技术挑战和未来研究方向,包括多模态知识图谱生成和深度学习优化的地理空间问答系统。

css33的专栏 114

LLC变压器,常见的4大问题解决方案

其中之一是当付边的绕组的匝数或层数较多的时候,层间或匝间寄生电容和付边的漏感发生一个寄生的振荡,轻载的时候,这个振铃的幅度会达到很高,导致输出电压比设计的要高许多。但当输入是低压的时候,开关频率比较低,LLC谐振回路的增益较大,因而比较容易发生变压器饱和的问题。由于LLC变压器工作在LC谐振状态,LC谐振回路有个特点就是Q值问题,在这里Q值是大于1的,因而就会有实际加在变压器上的电压要比输入电压高的问题,因而在设计变压器的时候就必须考虑到这一点,否则变压器就不是工作在你设计的磁感应强度上。

1265

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

把 ABAP ALV 表头做成两层分组:用 TOP-OF-PAGE 手工绘制双行列标题

摘要:本文介绍了在SAP ALV List中实现双层表头的方法。通过关闭系统默认列标题(no_colhead='X'),在TOP_OF_PAGE事件中手动绘制表头,使用sy-uline和sy-vline绘制线条实现分组效果。关键点包括:1)关闭系统表头;2)在事件处理中分两行输出分组标题和字段名;3)利用系统自动拼接线条的特性绘制表格边框。文中还指出了常见问题如线条自动粘连、颜色不生效等,并提供了完整示例代码和详细解释。这种方法适用于需要对字段进行业务分组的报表场景。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 258

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

8.26华为OD机试真题 新系统【仓库查询】

华为OD机试真题 新系统【仓库查询】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题 【仓库查询】多语言题解。

qq_45776114的博客 546

【动态导通电阻】GaN HEMT动态导通电阻的精确测量

2023年7月,瑞士洛桑联邦理工学院的Hongkeng Zhu和Elison Matioli在《IEEE Transactions on Power Electronics》期刊发表文章,提出了一种稳态测量方法,用于研究氮化镓(GaN)高电子迁移率晶体管(HEMT)的动态导通电阻(Ron)。实验结果显示,商业GaN器件在稳态下的动态Ron变化显著,稳定时间可达数分钟且与电压相关。传统的脉冲测量方法由于测试时间不足,可能导致结果不准确。该

荷塘阅色 1376

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

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

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

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

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

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

《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、付费专栏及课程。

余额充值