NDK13_C++基础: 重载函数、操作符重载、函数模板

NDK开发汇总

重载函数

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;

允许重载的运算符

类型 运算符
关系运算符 ==(等于),!= (不等于),< (小于),> (大于>,<=(小于等于),>=(大于等于)
逻辑运算符 ||(逻辑或),&&(逻辑与),!(逻辑非)
单目运算符 + (正),-(负),*(指针),&(取地址)
自增自减运算符 ++(自增),–(自减)
位运算符 | (按位或),& (按位与),~(按位取反),^(按位异或),,<< (左移),>>(右移)
赋值运算符 =, +=, -=, *=, /= , % = , &=, |=, ^=, <<=, >>=
空间申请与释放 new, delete, new[ ] , delete[]
其他运算符 ()(函数调用),->(成员访问),,(逗号),
void *operator new (size_t size)
{
	cout << "新的new:" << size << endl;
	return malloc(size);
}

void operator delete(void *p)
{
	//释放由p指向的存储空间
	cout << "新的delete" << endl;
	free(p);
}
... ...

模板

模板是泛型编程的基础

函数模板

函数模板能够用来创建一个通用的函数。以支持多种不同的形参。避免重载函数的函数体反复设计。

template <typename T> 
T max(T a,T b)
{
	// 函数的主体
	return  a > b ? a : b;
}
//代替了
int max(int a,int b)
int max(float a,float b)

类模板(泛型类)

为类定义一种模式。使得类中的某些数据成员、默写成员函数的参数、某些成员函数的返回值,能够取随意类型

常见的 容器比如 向量 vector 或 vector 就是模板类

template<class E,class T>
class Queue {
public:
    T add(E e,T t){
        return e+t;
    }
};

Queue<int,float> q;
q.add(1,1.1f) = 2.1f
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章