C++侯捷笔记-complex类

头文件(Header)

想要写一个完整的面向对象的程序,首先需要创建一个头文件供使用者使用其中的内容,下面是关于complex类头文件的一介绍。

#include<>与#include""的区别

对于大多数c/c++的初学者来说可能会见到#include< >和#include" “这二种形式的头文件。简单来说#include<>所包含的是原来已经有的头文件,#include” "中所包含的是自己写的头文件。

头文件(Header)中的防卫式声明

为了防止头文件被多次定义,故写程序时需要添加头文件的防卫式声明。

在这里插入图片描述

Header的布剧

在这里插入图片描述

  1. 在模块一中对下面模块所用的一些函数、类、头文件进行声明。
  2. 在模块二中对complex类进行声明。
  3. 在模块三中对complex类的成员函数进行定义。

Class的声明

在这里插入图片描述
对于一个类来说存在着公有(public)和私有(private)类,一般来说大部分的数据不愿意被别人获取设置为私有类,而大部分的函数被设置为公有类。

模板(template)

为了方便对不同类型的数据进行相同的操作,c++引入了模板。
在这里插入图片描述
使用模板之前需要用图片中第一处黄色的标识告诉系统,使用了未被定义的T(可随意更改)作为类型名(typename),第二处黄色的标识则表明数据暂时为未被定义的T型(注意:此处的数据类型应该与typename名相同)。
在这里插入图片描述
在主函数中定义complex对象时需要用<>表明其数据成员的类型。

内联函数(Inline)

在这里插入图片描述
表明上:在类内部定义的函数,或者在类中声明,类外用inline连接的函数为内联函数;实际上:代码块较为短小的为内联函数,代码块较长时无论是类中定义的函数还是inline连接的函数都不是内联函数。(代码块的长还是短由编译器决定)。
优点:效率比较高。

构造函数(Constructor)

初始化列表(initialization)

在这里插入图片描述
对于一个变量数值的设定有初始化和赋值二个阶段,initialization是初始化阶段,而一般在代码块中进行赋值,构造函数是用来对变量进行初始化的,故使用初始化列表(更加的大气,效率更高)。

函数重载(Overloading)

函数名相同,参数的个数或者类型不同(注意:返回值是否相同与函数重载无关)。
函数重载多用于构造函数中。且需要特别注意发生二义性!!!

在private中的构造函数

一般来说构造函数是放在public中,而不能放在private里,一旦放在private中则不能随意创建该类的对象;但在某些特别的地方要求只能创建一个对象,会放在private中,然后用一种特殊的方法创建该变量(暂时不做了解)。

构造函数小结(!!!)

  • 使用初始化参数列表。
  • 函数重载多用于构造函数。
  • 主要函数重载时不能产生二义性。(无参函数和默认参数函数一起时容易产生)
  • 构造函数多数放在public中,但有少数会放在private中。

常量成员函数(const用法之一)(!!!)

在这里插入图片描述

若成员函数没有改变数据成员时一定要在()和{}间加 const,若不加const编译器可能会报错,下面是报错的情形之一:
在这里插入图片描述
在这里创建了一个const类型的对象,表明其值不会发生改变,但是如果在其成员函数(未改变数据成员的)处没加const编译器就会认为你可能改变该对象的值,可能会报错(在该列子中若成员函数没加ocnst调用real和imag()函数时就会报错)。

引用(reference)的用法

参数的传递

在这里插入图片描述
在写程序时对于参数的传递我们优先考虑率传引用(reference),引用的本质是指针,对于大多数编译器都是四个字节,相对于传double类的变量(value)来说更加迅速。若不想改变传递的参数值,可在前加上const.

返回值的传递

在这里插入图片描述
返回引用的效率一般高于返回变量,故在允许的情形下多返回引用。
不能返回引用的情况——返回的是在代码块中新创建的变量

complex& do1(complex*a,const complex&b)
{
a->real+=b.real;
a->imag+=b.image
return *a;
}
complex& do2(complex*a,const complex&b)
{
complex c;
c=a->real+b.real;
c=a->imag+b.image
return c;
}

在do2函数中返回的是临时创建的对象c的引用,在该函数生命周期结束后,c会自动消失,故其也就不存在别名,也就是引用。
在do1函数中返回引用不会报错,因为对象a是之前就存在的,而return *a是解引用操作返回的是complex类而不是指针。

友元

可以打破封装,可直接在友元函数中使用private中的数据成员。
在这里插入图片描述
相同的class中的对象互为友元
在这里插入图片描述

在func函数中直接调用了private中的数据成员(并为有friend标注),其原因是该函数参数对象的类型也是 complex类。

操作符重载

成员函数

在这里插入图片描述

在这里插入图片描述
所以的成员函数都会隐藏一个参数this,谁使用该函数谁就是this (注意:this不能像下面图片那样写在函数的参数列表中,否者会报错,但在函数体内可以用)。

complex c1,c2,c3;
c1+=c2+=c3;

在连续使用+=函数时需要注意该函数的返回值的类型应该是complex而不是void。

全局函数(无this pointer)

在这里插入图片描述
注意:此处返回的是value而不是reference,因为返回的是临时创建的对象

临时对象(temp object)
complex();
complex(2,3);

从上面的代码和图片中我们发现,complex后面直接接的是()而不是一个对象,该现象叫做临时对象。若该代码使用完后立即结束,则可以使用临时对象。

以上就是全部的内容,如果有疑问,欢迎评论区下方留言;本人水平有限 ,如有错误,也欢迎在评论区下方批评指正。若是喜欢本文,就帮忙点赞吧!

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值