C++侯捷笔记-complex类
头文件(Header)
想要写一个完整的面向对象的程序,首先需要创建一个头文件供使用者使用其中的内容,下面是关于complex类头文件的一介绍。
#include<>与#include""的区别
对于大多数c/c++的初学者来说可能会见到#include< >和#include" “这二种形式的头文件。简单来说#include<>所包含的是原来已经有的头文件,#include” "中所包含的是自己写的头文件。
头文件(Header)中的防卫式声明
为了防止头文件被多次定义,故写程序时需要添加头文件的防卫式声明。
Header的布剧
- 在模块一中对下面模块所用的一些函数、类、头文件进行声明。
- 在模块二中对complex类进行声明。
- 在模块三中对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后面直接接的是()而不是一个对象,该现象叫做临时对象。若该代码使用完后立即结束,则可以使用临时对象。
以上就是全部的内容,如果有疑问,欢迎评论区下方留言;本人水平有限 ,如有错误,也欢迎在评论区下方批评指正。若是喜欢本文,就帮忙点赞吧!