2、构造函数
2.1 inline函数
定义类的时候,可以直接在body中定义函数(inline函数,在body中定义完成),也可以只是在body中声明函数
inline内联函数:如果定义的函数是内联函数,那么会运行比较快,尽可能定义为内联函数
在body外,通过inline关键字来指定该函数为inline函数。
注意的是,上面所有的inline函数,都只是我们指定的,希望它为inline,具体是不是,要看编译器来决定
C++ Primer Plus的解释:
内联函数是C++为了提高程序运行速度进行的一项改进。常规函数和内联函数的主要区别不在于编写方式,而在于C++编译器如何将它们组合到程序中。
C++的内联函数的编译代码与其他程序的代码“内联”起来。编译器将使用相应的函数代码替换函数调用。对于内联代码,程序无需跳到另一个位置处执行代码,再跳回来。因此,内联函数的运行速度比常规函数稍快,但是代价是要占据更多内存。

程序员请求将函数设置为内联函数时,该请求不一定会通过,因为编译器可能认为该函数过大或者注意到函数调用了自己,因此不将其作为内联函数,也有些编译器没有启用或者实现这种特性。
2.2 访问级别
数据应该被定义为private级别
函数如果要被外界使用应该定义为public;如果知识内部处理,定义为private。
2.3 ctor构造函数
2.3.1ctor的写法
方式一:(推荐)
1
2
3complex(T r = 0, Ti = o)//函数的名称与class的名称一致
:re(r),im(i) //中间这一行就是初始化
{}方式二:(不推荐)
1
2
3
4
5complex(double r = 0,double i =0)
{
re = r; //使用赋值进行初始化
im = i;
}如果通过构造函数来创建对象。会自动调用构造函数进行创建。
- 构造函数名称需要与类的名称一样
- 函数的参数可以有默认参数
- 构造函数没有返回类型
2.3.2ctor/函数 重载
构造函数可以有很多个,可以重载;但是上面1 2 两个构造函数冲突了
1
complex c2(); //"()"可以不要,一样的
上面的调用方式对于两个构造函数都适用,冲突
1 | double real () const { return re; } |
1 | void real (double r) { re = r; } //不能有const |
同名的函数可以有多个,编译器会编成不同的名称,实际调用哪个就会根据哪个适用
2.3.3 ctor 放在 private 区
**
- 通常构造函数不要放在private中,这样外界没法调用,也就无法创建对象
- 在设计模式
Singleton
(单体)中,将构造函数放在了private中;这个class只有一份,外界想要调用的时候,只能使用定义的getInstance()
函数来取得这一份;外界无法创建新的对象
2.4 const 常量成员函数
对于不会改变数据内容的函数,一定要加上const
1 | { |
对于上面调用方式,我们创建一个常量复数然后调用函数输出实部虚部,如果上面real和imag函数定义的时候,没有加const,那么这里函数默认的意思是可能会改变数据,与我们的常量复数就矛盾了,编译器会报错;因此,对于不会改变数据内容的函数,一定一定要加const
3、参数传递与返回值—-引用
3.1参数传递
值传递 pass by value,传递value是把整个参数全传过去,尽量不要直接value传递 例 double r
引用传递 pass by reference,传引用相当于传指针,快,形式也漂亮 例 complex&
如果只是为了提升速度,不想改变数据,那么传const引用;这样传进去的东西,不能被修改
例 const complex&
3.2返回值传递
返回值的传递,尽量返回引用
在函数中创建的变量 (local 变量),要返回——这种情况是不能返回引用的;因为函数结束后函数中创建的变量就消失了,无法引用
传递者无需知道接受者是以reference形式接受——所以用reference形式很便捷
4、友元friend
4.1友元

友元:friend,修饰在函数定义之前,表示这个函数可以直接拿该类对象的private数据
1 | inline complex& _doapl(complex* ths ,const complex& r) |
如上面所示,声明为friend后,函数可以直接取得re和im,如果不被声明为friend,只能通过
调用real和imag函数来得到,效率极低
4.2相同class的object互相为friends

1 | { |
相同class的不同对象互相为友元,即可以直接取另一个object的private data