pppploi8's Blog

欢迎来到pppploi8的个人博客!

C++ Primer学习笔记-复制构造函数和重载操作符

复制构造函数

用在使用等号的时候进行复制用的构造函数,参数是对象自身的引用,如果没有默认的复制构造函数则由编译器自动生成

代码如下:

class ObjectA{
public:
    ObjectA(){ }
    ObjectA(const ObjectA& o){
        a = o.a*2;//复制时对a*2 
    } 
    void setA(int x){
        a = x; 
    }
    void print(){
        cout << a << endl;
    }
private:
    int a;
}; 
int main() {
    ObjectA oa1;
    oa1.setA(222);
    ObjectA oa2 = oa1; 
    oa2.print(); //输出444 
    return 0;
}

复制构造函数一般用在对象内有指针的时候里手动复制指针

另外,如果不希望对象可以被复制,那么也可以把复制构造函数定义成private

但是友元类和友元函数依然可以调用私有的复制构造函数,所以也可以定义一个复制构造函数的申明而不去实现它


重载操作符

重载操作符是特殊的函数,使用保留字operator后接需要定义的操作符符号。格式如下

Object operator + (const Object&,const Object&);

因为声明了加号操作符,所以就可以将两个Object相加

代码如下:

string operator + (string s, int i){
    char c[8];
    itoa(i,c,10);
    return s + c;
}
int operator + (int i,string s){
    int t = strtol(s.c_str(),NULL,10);
    return i + t;
}
int main() {
    string s = "1234";
    cout << s + 5678 << endl;
    cout << 4321 + s << endl;
    return 0;
}

另外,重载运算符也可以是类方法,在这种情况下参数只需要写一个对象,而自身则使用this指针或者直接访问,代码如下

class Student {
public:
    Student (int a,string n){
        age = a;
        name = n;
    }
    bool operator < (const Student& s){
        return age < s.getAge();
    }
    int getAge() const {
        return age;
    }
private:
    int age;
    string name;
};
int main() {
    Student s1 = Student(18,"张三");
    Student s2 = Student(19,"李四");
    cout << (s1 < s2) << endl;
    s1 = Student(20,"张三");
    cout << (s1 < s2) << endl;
    return 0;
}

另外也可以对一元操作符重载,比如

class Student {
public:
    Student (int a,string n){
        age = a;
        name = n;
    }
    Student& operator ! (){
        age = 100 - age;
        return *this; 
    }
    int getAge() const {
        return age;
    }
private:
    int age;
    string name;
};
int main() {
    Student s1 = Student(18,"张三");
    s1 = !s1;
    cout << s1.getAge() << endl;
    s1 = !s1;
    cout << s1.getAge() << endl;
    return 0;
}