基本概念
重载的运算符是具有特殊名字的函数:operator和其后要定义的运算符号组成。
重载的运算符也包含返回类型、参数列表、函数体。
模板
函数模板:以关键字template开始,后跟一个模板参数列表,这是一个逗号分隔的一个或者多个模板参数列表,以<>
包起来。
template<typename T>
T的实际类型在编译时候根据compare使用情况确定
int compare(const T &1,const T &v2){
if(v1< v2) return -1;
if(v2<v1) return 1;
return 0;
}
模板的实例
compare(1,0),编译器为我们推断出模板参数为int,并将其绑定到目标参数T。T被替换为int
在模板参数列表中,class与typename关键字含有相同,可以互换。
//错误,U必须加上class或者typename
template<typename T,U> T calc(const T&,const U&);
非类型模板参数
除了定义类型参数,还可以定义非类型参数。一个非类型参数表示一个值而非一个类型。
引用返回左值
调用一个返回引用的函数得到左值,其他类型得到右值。
返回引用返回的是对象本身,可以作左值。
class A{
public:
int x;
A& get(){
return *this;
}
//此时应该是A的副本
A get1(){
return *this;
}
}
int main(){
A a;
a.x=4;
a.get().x=100;
cout<<a.x<<endl; //100
}
类的静态成员
虽然静态成员不属于类的某个对象,但可以使用类的对象、指针或者引用来访问静态成员。
定义静态
可以在类内部或者外部定义静态成员函数。当在外部定义静态时成员时,不能重复static关键字。static只出现在类内部声明语句。
必须在类的外部定义和初始化每个静态成员。一个静态成员只能定义一次。
注意点
1.即使常量静态数据成员在类内部被初始化,也应该在类的外部定义一下该成员
class Account{
public:
static double rate(){return interestRate;}
static void rate(double);
private:
static constexpr int period=30;
double daily_tbl[period];
};
//类外部定义一下
constexpr int Account::period;