头文件的书写格式
(eg. complex.h):
#ifndef _COMPLEX_
#define _COMPLEX_
(防卫式声明,防止重复的include动作)
class template
template<typename T>
class complex
{
privete:
T re , im;
}
通过T来告诉编译器,目前没有想好是什么内容,需要在使用类定义的时候指明:
complex<double>...
complex<int>...
构造函数
函数在class本体内定义即为inline函数,性能较好。
创建对象时,构造函数会自动调用。构造函数的函数名称一定和类的名称相同,并且函数的参数是可以有默认值的,创建时若没有指明值则根据默认值进行构造。
complex(double r=0 , double i=0):re(r),im(i){}
上述写法比在函数体中进行赋值的效率更高。
Note : 构造函数可以没有返回值。
不带指针的类多半不需要写析构函数。
构造函数可以有很多个(重载)
//成员函数
double real() const{return re;}
void real(double r) {re=r;} //注意!不能有const
在函数名后加const为常量成员函数,不会改变数据内容的函数需要加上const。
Note : const 也可以出现在对象和变量的前面,如果const对象调用的成员函数没有加const会导致编译错误。
参数传递与返回值
值传递/引用传递(to const)
总的来说,引用传递的效率远远高于值传递,所以参数传递两种方式都可以的话,尽量选择引用传递。
返回值的传递也有值和引用两类。
友元 friend
友元打破了封装,可以自由取得friend的private成员。
相同class的各个objects互为友元。
操作符重载
1. 成员函数 this
谁调用操作符,谁就是this,在参数列表中不能写this,但是在函数体内可以直接用,
2. 非成员函数 无this
通过三个函数来应对使用者的三种可能用法,全域函数无this。
之所以没有返回引用,是因为它们返回的值必定是局部对象,所以不能返回引用。(注意)