一. 重载

1. 函数重载

目的:实现一组相同函数名,不同参数列表的函数。 格式:同名函数,参数列表不同。

//例:设计一个函数,可以返回2~4个变量的和
int Plus(int a, int b) {
    return a + b;
}
int Plus(int a, int b, int c) {
    return a + b + c;
}
int Plus(int a, int b, int c, int d) {
    return a + b + c + d;
}
int main() {
    cout << Plus(1, 2) << endl;
    cout << Plus(1, 2, 3) << endl;
    cout << Plus(1, 2, 3, 4) << endl;
}

2. 运算符重载

目的:自定义类型,系统不知道“+"">"等符号的意义。运算符重载可以教给系统运算符的意义。 格式:[返回值类型] operator [运算符] (参数) {重载代码}; 这里实现一个复数类为例。 这个操作叫:运算符重载为类的成员函数,在类内定义。

class Complex {  //实现一个复数类
public:
    int Re, Im;  //实部,虚部
    //双目运算符,有一个参数,就是运算符右边的数
    //如 a + b 参数就是b 而a默认是上面定义的Re, Im
    //返回值就是这个类的类型,毕竟加减完类型又不变对吧
    Complex operator + (Complex &b) {
        //假设结果为c
        Complex c;
        c.Re = Re + b.Re; 
        c.Im = Im + b.Im;
        return c;
    }
    Complex operator - (Complex &b) {
        Complex c;
        c.Re = Re - b.Re; 
        c.Im = Im - b.Im;
        return c;
    }
    // * / % += -= /= *= %= |= &= ^= 略,反正就这么个格式
    //[------------------------分割线-----------------------------]
    //比较大小类,唯一和加减类不同的地方是:返回值为bool。因为比较大小,要么真要么假
    bool operator < (Complex &b) { //复数的模比较大小
        double m1 = sqrt(Re * Re + Im * Im); 
        double m2 = sqrt(b.Re * b.Re + b.Im * b.Im);
        return m1 < m2; 
        /*return m1 < m2;  相当于:
        if(m1 < m2)
            return true;  //如果m1<m2,计算机就认为a<b成立
        else
            return false; //反之不成立
        */
    }
    bool operator > (Complex &b) { //复数的模比较大小
        double m1 = sqrt(Re * Re + Im * Im); 
        double m2 = sqrt(b.Re * b.Re + b.Im * b.Im);
        return m1 > m2;
    }
    // < > <= >= == !=都是这样,省略不写了 
    //[------------------------分割线-----------------------------]
    //前后置自增自减。可以认为都没有参数,但是后置运算需要(int),记住吧
    Complex operator ++() {  //++前置运算符,假设为实部+1
        Complex c;
        c.Re = Re + 1;
        c.Im = Im;
        return c;
    }
    Complex operator ++(int) {  //++后置运算符,假设为实部+1
        Complex c;
        c.Re = Re + 1;
        c.Im = Im;
        return c;
    }
    //[------------------------分割线-----------------------------]
    //重载输入输出流,格式如下
    ostream &operator << (ostream &output) {  
        output << Re << " + " << Im << 'i'; 
        return output;
    }
    istream &operator >> (istream &input) {
        input >> Re >> Im;
        return input;
    }
};

若要求在类外重载,需要多写一个参数a,意义如上文所示。

class Complex {
public:
    int Re, Im;
}
Complex operator + (Complex &a, Complex &b) {  // +号重载,有两个参数
    Complex c;
    c.Im = a.Im + b.Im;
    c.Re = a.Re + b.Re;
    return c;
}
Complex operator ++ (Complex &a) { //前置++
    a.Re ++;
    return a;
}
Complex operator ++ (Complex &a, int) {  //后置++
    a.Re ++;
    return a;
}
ostream &operator << (ostream &output, Complex &b) {
    output << b.Re << " + " << b.Im << 'i';
    return output;
}
istream &operator >> (istream &input, Complex &b) {
    input >> b.Re >> b.Im;
    return input;
}
//其他运算符同理。

重载完之后,系统就知道如何使用运算符运算了。

二. 友元函数

[友元即friend],可以访问private数据。 在正常的函数前加friend修饰即可。

friend Complex operator + (Complex &b) {
    Complex c;
    c.Re = Re + b.Re;
    c.Im = Im + b.Im;
    return c;
}

这样,函数就可以访问类中的私有(private)数据。

三. 构造函数

定义一个类的变量时,自动执行的函数。 此函数也可以重载,方式同上。 格式:类名(参数表) {代码} 【析构函数】和构造函数相反,析构函数是类的变量内存被释放时,自动执行的函数。

class Complex {
public:
    int Re, Im;
    Complex() {
        Re = 0, Im = 0;
    }
    Complex(int a, int b) {  //构造函数也可以重载
        Re = a, Im = b;
    }
    ~Complex() {
        cout << "bye~";
    }
}
int main() {
    Complex a;
    Complex b(1, 2);
}

四. 进制

进制转换很简单,这里拿十进制转二进制举例子。 令待转化的十进制数为x,转出v进制。这里转出二进制,所以v=2。 不断对x取模,直到x=0.将每次得到的模数倒过来,就是x的二进制表示。

int bit[100], tot = -1;  //用数组记录每次得到的模数
int v = 2;
while(x > 0) {
    bit[++tot] = x % v;
    x /= v;
}
while(tot >= 0) {
    cout << bit[tot--];
}

这里默认x是10进制数。若输入的不是10进制,则可以按照如下程序转换成10进制。

string num;  cin >> num; //输入的数
int x = 0;
int v = 2; //输入数的进制
for(int i = 0; i < num.size(); i ++) {
    if(num[i] >= '0' && num[i] <= '9')
        x = x * v + num[i] - '0';
    else if(num[i] == 'A' || num[i] == 'a') {
        x = x * v + 10;
    }else if(num[i] == 'B' || num[])
}
//此时x就是10进制数。

提供一份任意进制转任意进制的模板代码。

#include <bits/stdc++.h>
using namespace std;
const char change[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};

int main() {
    //x进制转y进制模板   (2 <= x,y <= 16)
    cout << "请输入待转换数:" << endl;
    string input;  cin >> input; //输入的数
    cout << "请输入此数的进制:" << endl;
    int v;  cin >> v;
    
    int x = 0;
    for(int i = 0; i < input.size(); i ++) {
        if(input[i] >= '0' && input[i] <= '9'){
            x = x * v + input[i] - '0';
        }else if(input[i] == 'A' || input[i] == 'a') {
            x = x * v + 10;
        }else if(input[i] == 'B' || input[i] == 'b') {
            x = x * v + 11;
        }else if(input[i] == 'C' || input[i] == 'c') {
            x = x * v + 12;
        }else if(input[i] == 'D' || input[i] == 'd') {
            x = x * v + 13;
        }else if(input[i] == 'E' || input[i] == 'e') {
            x = x * v + 14;
        }else if(input[i] == 'F' || input[i] == 'f') {
            x = x * v + 15;
        }
    }
    //此时x为10进制数
    char output[1010];
    int tot = -1;  //用数组记录每次得到的模数

    cout << "请输入转出的进制:" << endl;
    cin >> v;
    while(x) {
        output[++tot] = change[x % v];
        x /= v;
    }

    cout << "结果为:" << endl;
    while(tot >= 0) {
        cout << output[tot--];
    }

    return 0;
}

作者:DreamCloud 代码仅供参考,如有问题请联系我!