0
点赞
收藏
分享

微信扫一扫

面向对象高级编程 - 上

微言记 2022-03-31 阅读 99

文件与类的声明

Object Based:面对的是单一 class 的设计
Object Oriented:面对的是多重 classes 的设计,classes 和 classes 之间的关系

.h:中进行 函数、类声明,还有一些是标准库;
.cpp :中要包含 声明 .h 的声明文件;

输出

#include <iostream>
using namespace std;

int main()
{
    int i = 7;
    cout << "i = " << i << endl;		// 标准输出,直接输出后面的内容,比c语言更加的方便

    return 0;
}

头文件的写法

/* complex.h  在写任何一个头文件时必须进行 防卫式的声明(guard) */
#ifndef __COMPLEX__
#define __COMPLEX__

template<typename T>    // 模板,可以提高代码的复用性
class Complex {         // class 的 头
public:                 // class 的 身体
    Complex (T r = 1, T i = 0) : re(r), im(i) {}	// 构造函数可以有默认值
    												// 构造函数不需要返回类型
    												// 构造函数初始化列表
    Complex () : re(0), im(0) {}					// 构造函数运行进行重载 overloading
    Complex& operator += (const Complex&);		// 函数的声明,类的相加操作符
    T real() const { return re; }				// 函数的定义,函数本地较为简单,编译器会自动设置为 inline 函数
    T imag() const { return im; }		// 函数的定义, const 常量成员函数(数据内容不会改变),注意是要加上const
    int func(const Complex& para)
    {
    	return para.re + para.im;	    // 相同class 的各个对象互为friend
    }

private:
	Complex ();			// 构造函数也是可以放到 private 里面,例如单例模式,只允许创建一个对象
    T re, im;

    friend Complex& __doapl (Complex*, const Complex&);	// 声明 __doapl 是 Complex 的友元函数,complex 创建的对象是可以访问的
};
#endif

inline (内联函数)函数

inline Complex& __doapl(Complex *ths, const Complex& r)
{
    ths->re += r.re;	// 可以自由获取friend的 private 成员
    ths->im += r.im;
    return *ths;    // 返回类型必须是一个对象
}

操作符重载 - 之成员函数 this

操作符相当于一种函数

void test()
{
    Complex c1(2, 1);
    Complex c2(5);
    c2 += c1;	// 1. 重载 += 操作符
}

// 2. 实部,虚部各自相加,然后返回一个引用的对象
inline Complex& __doapl(Complex *ths, const Complex& r)
{
    ths->re += r.re;
    ths->im += r.im;
    return *ths;    // 返回类型必须是一个对象
}

// 3. 重载操作符的实现,具体代码里面没有 this,添加 this 是为了方便理解
// 任何一个成员函数都有一个 this pointer
inline Complex& Complex::operator+=(thisconst Complex& r)
{
    return __doapl (this, r);
}

return by reference 语法分析

传递者 无需知道 接受者 是以 reference 形式接受

// 采用 reference 接收,比 值传递 的速度更快
inline Complex& __doapl(Complex *ths, const Complex& r)
{
    ths->re += r.re;
    ths->im += r.im;
    return *ths;    // 返回是一个对象, 接受者是一个引用,很合理
}
举报

相关推荐

0 条评论