C++知识点第五篇

一、运算符重载

  通过重载扩展C++运算符的功能,使其能够操作用户自定义的数据类型,增加程序代码的直观性和可读性。但运算符重载过程中具有以下限定条件:

(1)不能改变运算符的优先级(2)不能改变运算符的结合顺序(3)重载运算符不能使用默认参数(4)不能改变运算符所需要的参数个数(5)不能创造新的运算符(6)不能改变运算符原有含义(7)若运算符被重载为类的成员函数,则只能是非静态的成员函数

重载方式:非静态成员函数、友元函数、普通函数

1、非静态成员函数方式

  第一个参数通过对象的this指针传递,参数比该运算符实际参数少一个。

2、友元和普通函数

  参数与实际所需相同,但友元可以直接访问类的私有成员。普通函数只能通过类的公有成员访问。

二、特殊运算符重载

1、自增自减运算符

  分为前缀和后缀两种情况。 (1)   X& operator@(){}    (2)    X& operator@(int) {}

2、重载赋值运算符

  对于类而言,若未重载赋值运算符,编译器将产生默认的赋值运算符函数,以按位复制的方式实现对象非静态数据成员的复制。但当类包含有指针数据成员时,使用默认赋值运算符进行赋值时,常会发生指针悬挂问题。

3、重载输出运算符<<

ostream& operator<<(ostream& os, classType object)

{    os<<……;  return os;     }

4、重载输入运算符>>

istream& iperator>>(istream& is, classType object)

{    is>>……;  return is;     }

#include <iostream>
#include <cstring>
using namespace std;

class Sales
{
    char name[10];
    char id[18];
    int age;
public:
    Sales(char* Name, char* ID, int Age)
    {
        strcpy(name, Name);
        strcpy(id, ID);
        age = Age;
    }
    friend ostream& operator<<(ostream& os, Sales &s)
    {
        os<<s.name<<"\t";
        os<<s.id<<"\t";
        os<<s.age<<endl;
        return os;
    }
    friend istream& operator>>(istream& is, Sales &s)
    {
        cout<< "输入雇员姓名、ID、年龄"<<endl;
        is>>s.name>>s.id>>s.age;
        return is;
    }
};

int main()
{
    Sales s1("杜康", "12345678", 25);
    cout << s1 <<endl;
    cin >> s1;
    cout << s1 <<endl;
    return 0;
}

三、函数模板和模板函数

  函数模板提供了一类函数的抽象,它提供了任意类型为参数及返回值。函数模板经实例化后生成的具体函数成为模板函数。函数模板代表了一类函数,模板函数表示某以具体函数。

函数模板:

#include <iostream>
using namespace std;

template <class T>
void sort(T &a, int n)
{
    for(int i = 0; i < n; i++)
    {
        int p = i;
        for(int j = i; j < n; j++)
            if(a[p] < a[j])
                p = j;
        int t = a[i];
        a[i] = a[p];
        a[p] = t;
    }
}

template <class T>
void display(T &a, int n)
{
    for(int i = 0; i < n; i++)
        cout << a[i] << " ";
    cout << endl;
}

int main()
{
    int a[] = { 1, 41, 5 ,2 , 8, 21, 23};
    char b[] = { 'a', 'x', 'y', 'e', 'q', 'g', 'o', 'u'};
    sort(a, 7);
    sort(b, 8);
    display(a, 7);
    display(b, 8);
    return 0;
}

类模板:

#include <iostream>
#include <cstring>
using namespace std;

const int MAXSIZE = 10;

template <class T, int MAXSIZE>
class Stack
{
private:
    T elems[MAXSIZE];
    int top;
public:
    Stack() { top = 0;}
    void push(int e);
    T pop();
    bool empty() { return top == 0; }
    bool full() { return top == MAXSIZE; }
};

template <class T, int MAXSIZE>
void Stack<T, MAXSIZE>::push(int e)
{
    if(top == MAXSIZE)
    {
        cout << "栈已满,不可再加入元素!";
        return;
    }
    elems[top++] = e;
}

template <class T, int MAXSIZE>
inline T Stack<T, MAXSIZE>::pop()
{
    if(top <= 0)
    {
        cout << "栈空,无法弹出元素!";
        return 0;
    }
    top--;
    return elems[top];
}

int main()
{
    Stack<int, 10> iStack;
    Stack<char, 10> cStack;
    cout << "--------iStack--------"<<endl;
    for(int i = 0; i < 10; i++)
        iStack.push(i);
    for(int i = 0; i < 10; i++)
        cout << iStack.pop() << " ";
    cout << endl;
    cout << "--------cStack--------"<<endl;
    cStack.push('A');
    cStack.push('B');
    cStack.push('C');
    cStack.push('D');
    for(int i = 0; i < 4; i++)
        cout << cStack.pop() << " ";
    cout << endl;
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值