内联函数:
函数在class里面定义(侯老师的说法)
好处:快,好
注意:如果函数过于复杂,即使加了inline,编译器也无法把它识别为inline函数
C++ 内联函数是通常与类一起使用。如果一个函数是内联的,那么在编译时,编译器会把该函数的代码副本放置在每个调用该函数的地方。
对内联函数进行任何修改,都需要重新编译函数的所有客户端,因为编译器需要重新更换一次所有的代码,否则将会继续使用旧的函数。
如果想把一个函数定义为内联函数,则需要在函数名前面放置关键字 inline,在调用函数之前需要对函数进行定义。如果已定义的函数多于一行,编译器会忽略 inline 限定符。
在类定义中的定义的函数都是内联函数,即使没有使用 inline 说明符。
访问级别
一般情况,数据和一些内部使用的函数都被定义为private,而想让外界调用的函数则被定义为public
由上述结果可以,想要访问私有变量,只能通过调用公有的方法来实现
注意:private和public没有严格的摆放顺序
构造函数
C++中,当创建一个对象时,有一个函数就会自动被调用,即为构造函数。
注意:
1. 构造函数名称和类的名称一定要相同
2. 构造函数没有返回值类型(因为构造函数就是为了创造对象,没必要写返回值类型)
3. 构造函数独有的操作,图片中初值列、初始列这一行赋值操作,其实是和****{}****里面的赋值操作等同,但是这样处理有一个好处,
**数值的设定一般有两个阶段:1、初始化2、赋值**。
如果直接在{}里面操作(图片右上角),就相当于放弃了初始化的操作,导致时间和效率的落后,
**所以虽然结论相同但是过程不一样。**
4. 你不可能直接调用构造函数
5. 图片中这种不带指针的类**多半**不用写析构函数
重载
overloading:相同函数名称,却一个以上
1. 图片中的两个real函数表面同名,但是其实不同名
2. 函数重载常常发生在构造函数中
3. 图片中的1和2两个构造函数是冲突的,都存在默认值
把构造函数放在private中
单例模式:指一个类只允许有一个实例
设计的思路就是把类的构造函数声明为private,然后提供一个公共的接口使外部能够访问到类的实例,如上图
常量成员函数
class中的函数分为两种:
- 会改变数据 内容
- 不会改变数据内容(在函数后面加上const)
注意:右下角图片,当在class前面加const时,如果类中的函数后面没有const会出错
类中const放在成员函数的前后有什么区别????
答:const T & operator [] (int i)const;
后面的const是修饰隐藏的this指针的,意思是类的成员变const,不可修改
前面的const 是指函数返回值是const类型的。
简言之:一个是成员变量,一个是返回值类型
参数传递
- 传引用(四个字节)就相当于传指针那么快,在参数传递的过程中尽可能都是传引用;
- 传引用的时候如果不希望被改变,可以加上const使不可改变;
- 当某一些变量字节很小的时候可以考虑传value;
返回值传递
返回值的传递也尽量传引用
友元函数
友元函数可以直接拿private中的数据,友元函数相当于打开了封装的大门
相同类的各个对象互为友元
Class外的各种定义
-
如果两个复数类型的相加是在**临时变量**中进行的,执行完会被销毁
,这种情况不能使用传引用的操作;
- 而上图中的加法操作是在第一个参数的地址空间中进行的,可以使用传参数(
注意是这种情况可以传引用
)
操作符重载(再看看
)
注意:
- 这里是类外成员函数,需要在函数前面加上类名complex
- 成员函数分为类内和类外,并且需要注意一下和inline函数的区别
这里就是前面提到的不能传引用的情况,这里的两数相加会创建临时对象,离开这个函数就会死亡,所以不能把reference传出去,一传出去,当临时对象死亡时,外界就无法用到这个引用了,所以图片的中蓝色部分一定要return by value。
临时对象:**typename()**就是上面的三个return的后面部分
右图中的黄色部分执行到下一行就会不见了,销毁
上面的“+”这块应该采用return by reference更好
注:传参或者传返回值采用reference速度更快
上图中“<<”这种特殊的操作符只能写成非成员函数(也就是全局的这种写法)这种形式