重载函数
C++ 允许在同一作用域中的某个函数和运算符指定多个定义,分为函数重载和运算符重载。
函数重载
void print(int i) {
cout << "整数为: " << i << endl;
}
void print(double f) {
cout << "浮点数为: " << f << endl;
}
操作符重载
C++允许重定义或重载大部分 C++ 内置的运算符
函数名是由关键字 operator 和其后要重载的运算符符号构成的
重载运算符可被定义为普通的非成员函数或者被定义为类成员函数
成员函数
class Test1 {
public:
Test1(){}
//定义成员函数进行重载
//返回对象 调用拷贝构造函数 释放函数内 t 对象
//引用类型(Test1&) 没有复制对象 返回的是 t 对象本身 t会被释放 所以会出现问题(数据释放不彻底就不一定)
// 可以输出 t 与 t3 地址查看
Test1 operator+(const Test1& t1) {
Test1 t;
t.i = this->i + t1.i;
return t;
}
//拷贝构造函数 (有默认的)
Test1(const Test1& t){
//浅拷贝
this->i = t.i;
cout << "拷贝" << endl;
//如果动态申请内存 需要深拷贝
};
int i;
};
Test1 t1;
Test1 t2;
t1.i = 100;
t2.i = 200;
//发生两次拷贝
// C++真正的临时对象是不可见的匿名对象
//1、拷贝构造一个无名的临时对象,并返回这个临时对象
//2、由临时对象拷贝构造对象 t3
//语句结束析构临时对象
Test1 t3 = t1 + t2;
cout << t3.i << endl;
Xcode上玩,使用的g++编译器会进行 返回值优化(RVO、NRVO) 从而看不到拷贝构造函数的调用。
可以加入 “-fno-elide-constructors” 取消GNU g++优化
对windows vs编译器cl.exe无效,VS Debug执行RVO,Release执行NRVO
RVO(Return Value Optimization):消除函数返回时创建的临时对象
NRVO(Named Return Value Optimization):属于 RVO 的一种技术, 直接将要初始化的对象替代掉返回的局部对象进行操作。
非成员函数
class Test2 {
public:
int i;
};
//定义非成员函数进行 + 重载
Test2 operator+(const Test2& t21, const Test2& t22) {
Test2 t;
t.i = t21.i + t22.i;
return t;
}
Test2 t21;
Test2 t22;
t21.i = 100;
t22.i = 200;
Test2 t23 = t21 + t22;
cout << t23.i << endl;
允许重载的运算符
void *operator new (size_t size)
{
cout << "新的new:" << size << endl;
return malloc(size);
}
void operator delete(void *p)
{
//释放由p指向的存储空间
cout << "新的delete" << endl;
free(p);
}
... ...