码迷,mamicode.com
首页 > 编程语言 > 详细

C++学习笔记07

时间:2016-05-06 01:59:02      阅读:176      评论:0      收藏:0      [点我收藏+]

标签:

运算符函数的定义格式二:成员函数

    返回类型operator运算符(除第一个操作数之外的参数表)

    双目:运算结果类型operator运算符(第二个操作数)

    单目:运算结果类型operator运算符()

    以成员函数形式定义时,第一个操作数作为了当前对象,不需要作为实参传递,只需要传递剩余的操作数就可以了。在运算符函数里可以通过*this或者this->来访问第一个操作数。

    规定只能用成员函数的[],(),=,->,类型转换

    如果有指针成员指向动态内存,还应该自己写复制运算符函数来实现跟拷贝构造函数相似的功能。三大:拷贝够着、赋值、析构

//[]{}->=type 这些运算符只能是成员函数
#include<iostream>
#include<cstring>
using namespace std;

class S{
    char* p;
    int len;
private:
    S(const S& x);//私有拷贝构造,禁止拷贝
public:
    S(const char* str=""){
        len = strlen(str);
        p = new char[len+1];
        strcpy(p,str);
    }
    ~S(){
        delete[] p;p=NULL;
    }
    S& operator=(const S& s1){//以当前对象作为赋值结果 成员函数
        if(&s1==this) return *this; // 如果传入参数是自己,就直接返回
        len = s1.len;
        delete[] p;//释放旧的动态内存
        p=new char[len+1];//为p开辟新动态内存
        strcpy(p,s1.p);//复制动态内存中的字符串过来
        return *this;//返回当前对象
    }
    friend ostream& operator<<(ostream& o,const S& x){
        return o<<x.p;
    }

    char& operator[](int index){//成员函数
        return p[index];
    }

};
int main()
{
    S a,b("furong");//是初始化,不是赋值
    S c;
    //...
    c=a=b;//c.operator=(a.operator=(b))
    cout<<a<<","<<b<<","<<c<<endl;
    b=b;//b.operator=(b)
    cout<<b<<endl;
    cout<<a[3]<<endl;//operator[] a,3
    a[1]=o;
    cout<<a<<endl;
    system("pause");
    return 0;
}

    类型转换运算符函数格式为

      operator 类型名()

    不写返回类型,返回类型跟“类型名”一致,只能是成员函数。

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

class Person{
    string name;
    int age;
    float salary;
public:
    Person(const char* n ,int a,float s):name(n),age(a),salary(s){}//排名不分先后
    operator string(){return name;}
    operator double(){return salary;}
    operator int(){return age;}
};

int main()
{
    Person a("芙蓉",18,80000);
    string info = a; // a.operator string()
    double money = a;// a.operator double()
    int age = a;//a.operator int()
    cout<<info<<","<<money<<","<<age<<endl;
    system("pause");
}

    圆括号作为运算符时,参数个数不定。函数定义格式:

      返回类型 operator()(参数表)

    支持圆括号运算符的对象也称为函数对象,因为使用的形式特别像调用函数。

#include<iostream>
using namespace std;

class A{
    int* p;
    int len;
public:
    A(int n,int v=0):p(new int[n]),len(n){
        for(int i=0;i<len;i++) p[i] =v;
    }
    void operator()(int start,int step){
         for(int i=0;i<len;i++) p[i] = start + i*step;
    }
    int operator()(){
        int sum=0;
        for(int i = 0;i<len;i++) sum +=p[i];
        return sum;
    }
    friend ostream& operator<<(ostream& o,const A& x){
        for(int i = 0;i<x.len;i++)
         o<<x.p[i]<<" ";
        return o;
    }
};
int main()
{
    A a(10);
    a(5,1);//从5开始步长为1填充这个数组 a.operator()(5,1)
    cout<<a<<endl;
    cout<<a()<<endl;//a.operator()()
    cout<<a<<endl;
    system("pause");
    return 0;
}

 

C++学习笔记07

标签:

原文地址:http://www.cnblogs.com/visions/p/5463925.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!