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

第十一章 使用类

记录CCPlus十一章内容,包含许多c++特性

博文地址

知识整理

运算符重载

运算符重载允许赋予c++运算符多种含义,c++根据操作数的数目和类型来决定采用哪种操作。

要重载运算符, 需使用运算符函数的特殊函数形式

operator op(argument list);

在运算符表示法中,运算符左侧的对象是调用对象,运算符右侧的对象是作为参数被传递的对象

c++对运算符重载的限制

  1. 重载后的运算符必须至少有一个操作数是用户定义的类型

  2. 使用运算符时不能违反运算符原来的句法规则

  3. 不能修改运算符的优先级

  4. 不能创建新运算符

  5. 不能重载以下运算符

    sizeof.::?:typeid,const_castdynamic_castreinterpret_caststatic_cast

友元

c++公有类方法可以访问类对象私有部分,但有些情况会有许多限制。

举书上的例子,*重载运算符函数使用如下

A = B * 2.75; // A,B都为类对象
A = B.operator+(2.75);  //转换为成员函数调用

但乘法还可以A = 2.75 * B,此时的重载成员函数就不能用于这种情况, 这时候就需要非成员函数,又非成员函数不能访问私有部分,于是友元函数就出来了。

通过让函数称为类的友元,可以赋予该函数与类的成员函数相同的访问权限。

要创建友元函数,先将函数原型放在类声明中,并在原型前加上关键字friend

friend ClassName operator*(double m, const ClassName & t) const;

虽然函数是在类声明中声明的,但其不是成员函数,所以函数定义时不要使用::,也不要在定义中使用关键字friend

ClassName operator*(double m, const ClassName & t) {
    
}

有了上述友元函数后,就可以使用A = 2.75 * B;语句了。

书上还有一个常用友元的例子,重载<<运算符

假设trip是一个类对象,要实现cout << trip;

如果使用一个成员函数来重载<<,就像使用成员函数重载*运算符那样,就必须trip << cout;才能有效,但这样显然是不好的,这时可以使用友元函数重载

void operator<<(ostream &os, const ClassName & t){

}

这样就可以使用cout << trip;,但这样不能和其他混合打印,如cout << "Trip: "<<trip<<" \n";

这里需要注意,ostream类将operator<<()函数实现为返回一个指向ostream对象的引用,所以可以连续使用。

可以对友元函数采用同样的方法

ostream & operator<<(ostream & os, const ClassName & t){
	os<<....
    return os;
}

因为返回类型是ostream&,所以可以连续使用。

那么,重载运算符是作为成员函数还是非成员函数呢?

对于某些运算符来说,成员函数是唯一合法的选择,但一般情况下,使用友元函数比较好。

类的自动转换和强制类型转换

c++存在内置类型转换,将一个标准型变量的值赋给另一种标准类型的变量时,若这两种类型兼容,则c++自动将这个值转换为接收变量的类型。

c++也可以将类定义与基本类型或另一个类相关,使得从一种类型转换为另一个类型有意义,如书上的例子

ClassName(double lbs); // 构造函数

ClassName cn;
cn = 19.6;  // 自动转换使用构造函数

只有接受一个参数的构造函数才能作为转换函数,有两个参数不能转换,除非第二个参数有默认值。

同时,为了防止意外的类型转换,c++新增了关键字explicit,用于关闭隐式转换,只能显式转换。

explicit ClassName(double lbs);

ClassName cn;
cn = 19.6;  // 不允许隐式转换
cn = ClassName(19.6);
cn = (ClassName)19.6  // 允许显式转换

c++还可以将类对象转换为内置类型,但必须使用转换函数

ClassName cn(34.6);
double host = double (cn); //有转换函数成立
double thin = (double) cn; // 有转换函数成立

转换函数要怎么创建呢?

operator typename();

同时需要注意以下几点

  1. 转换函数必须是类方法
  2. 转换函数不能指定返回类型
  3. 转换函数不能有参数
operator double();

ClassName::operator double(){
	
	return (double)..;
}

和转换构造函数一样,转换函数也会发生意想不到的转换,所以也可以使用关键字exlicit关闭隐式转换。

转换最好使用显式转换。

复习题

  1. 友元函数与成员函数之间的区别是什么?

    成员函数是类定义的一部分,通过特定的对象来调用。友元函数不是类的组成部分,可以直接调用。

  2. 非成员函数必须是友元函数才能访问类成员吗?

    要访问私有成员,必须是友元函数

  3. 哪些运算符不能重载?

    sizeof..*::?:

  4. 在重载运算符=()[]->时,有什么限制?

    以上运算符必须使用成员函数定义,不能使用友元函数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: "C Primer Plus" 是一本经典的 C 语言教程书籍,它旨在为初学者提供一种深入浅出、易于理解的方式来学习 C 语言的基础知识和应用技巧。这本书结构清晰,内容详实,深入浅出地讲解了 C 语言的各个方面,包括变量、数据类型、运算符、流程控制、函数、指针、结构体、文件操作等。通过逐步增加难度的方式,读者可以逐步领会 C 语言的精髓,从初学者成长为具备一定经验和技能的程序员。 与其他 C 语言教程不同的是,"C Primer Plus" 强调实战教学,让读者通过不断练习和编写实际程序来理解和掌握 C 语言的各种应用,从而在实际工作中更加得心应手。此外,书中也提供了大量的练习题和实例代码,方便读者自行探索和实践。 总之,"C Primer Plus" 是一本教授 C 语言的经典著作,它基于深入的理论知识,提供了大量的实战编程练习机会,适合想要深入学习 C 语言的初学者和有一定经验的程序员。 ### 回答2: 《C Primer》中文版是一本经典的C语言教程,原版为《C Primer Plus》,是一本聚焦于C语言程序设计入门、进阶和实践的杰出著作。本书全面覆盖了C语言语法、函数、指针、数组、字符串、文件操作、内存管理等核心内容,包含丰富的示例和练习,让学习者逐步了解和掌握C语言的核心要素。 《C Primer》中文版相比于英文原版,更方便中国学生阅读和理解。该书的内容体系完整,难度逐渐递增,因此对于C语言零基础的读者来说,也能循序渐进地学习C语言。该书知识点分类清晰,讲解详细,涵盖了C语言绝大部分特性和工具,有助于读者构建系统的学习框架,能够从小白逐步走向合格C程序员的道路上。 《C Primer》中文版是学习C语言必备的参考书籍之一,它不仅适用于学生自学,也适用于教授C程序设计的教师作为教材使用。它具有深入浅出、通俗易懂和良好的示范性质。对于只有一定编程经验的读者,该书也是适合挑战的好书。无论你是初学者还是进阶爱好者,它都能帮助你打下坚实的编程基础,快速提升编程实践能力,成为一个有成就的程序员。 ### 回答3: C Primer Plus 中文版是一本通俗易懂、系统完整的C语言教材,由Stephen Prata编写。其最新版为第六版,内容涵盖了从C语言的基础概念到高级特性的知识点,详细介绍了函数、指针、数组、结构体、文件操作、动态内存分配等重要概念和技术应用。全书分为26章,每章都配有大量的例子和练习题,使读者能够深入了解C语言的应用和开发方法,同时提供了大量的修改和调试技巧。 C Primer Plus 中文版不仅适用于初学C语言的新手,也可以作为已有C语言基础但需要提高的人员的参考书。此外,该书还涵盖了C语言编程的规范要求和工程实践,非常适合从事C语言编程的软件开发人员阅读和学习。总之,C Primer Plus 中文版是学习C语言的入门必备教材之一,无论是基础学习和提高深入,都具有重要的学习价值。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值