C++只能在类内实现的运算符重载

C++只能在类内实现的运算符重载

开门见山:在C++种只能在类内实现的运算符重载的只有四个,赋值运算符= 函数调用运算符() 下标运算符[] 指针访问类成员的运算符->

第一种:赋值运算符=的重载

首先我们需要知道的是,一个类如果什么都没有,系统会为这个类默认提供四种东西

1.无参构造函数(无参且函数体是空的)2.析构函数(无参,且函数体是空的)3.默认拷贝构造函数,对属性进行值拷贝4.赋值运算符的重载 operator=, 对属性进行值拷贝(也就是说,在我们实际重载之前,编译器以及写过一个值拷贝的构造函数了)

通常我们都知道前三个,那么第四个就可以解释为什么赋值运算符只能在类内进行重载了,因为如果是普通变量的普通类,那么系统提供的默认赋值函数是足够的,但是如果涉及指针的变量,就需要我们自定义赋值函数了(避免同一个指针地址同时作为两个类对象的成员数据,当其中一个被析构时,另一个对象报错的现象)

//赋值运算符重载

class Student

{

public:

Student(string a,int b):name(a),id(b)

{}

void Getname()

{

cout << this->name << endl;

}

void Getid()

{

cout << this->id << endl;

}

Student& operator=(Student& s)

{

name = "default";

id = 000;

return *this;

}

private:

string name;

int id;

};

int main()

{

Student s1("a", 1);

Student s2("b", 2);

s2 = s1;

s2.Getid();

s2.Getname();

return 0;

}

类外重载直接报错:

第二种:下标运算符[]

下标运算符[]之所以要用类内进行重载的原因在于,[]必须要用一个对象,比如a[i],b[j]等等,针对对象的取下标操作,如果是全局的话,[3]就显的毫无意义

//下标运算符[]重载

class Student

{

public:

Student(string a,int b):name(a),id(b)

{}

void Getname()

{

cout << this->name << endl;

}

void Getid()

{

cout << this->id << endl;

}

Student operator[](int x)

{

Student sub("default",000);

return sub;

}

private:

string name;

int id;

};

int main()

{

Student s1("a", 1);

Student s2("b", 2);

s1 = s2[1];

s1.Getid();

s1.Getname();

return 0;

}

第三种:函数调用运算符()

//函数调用运算符()重载

class Student

{

public:

Student(string a,int b):name(a),id(b)

{}

void Getname()

{

cout << this->name << endl;

}

void Getid()

{

cout << this->id << endl;

}

Student operator()(string a, int b,int c)

{

name = a;

id = b + c;

return *this;

}

private:

string name;

int id;

};

int main()

{

Student s1("a", 1);

Student s2("b", 2);

s2 = s1("b", 1, 2);

s2.Getid();

s2.Getname();

return 0;

}

第四种:指针访问类成员运算符

由于是用于指针访问类成员,因此->的重载必须是在类内完成的,不能够使用全局的重载

📚 相关推荐

天魔神谭
365不让提款

天魔神谭

📅 06-28 👁️ 7199
如何同步 iPhone 和 iPad
365下载手机版

如何同步 iPhone 和 iPad

📅 06-29 👁️ 8223
qq炫舞测试服务器维护,QQ炫舞体验服新界面安装操作方法 体验服开服、删档、维护答疑...
DNF疲劳值燃烧
beat365手机下载

DNF疲劳值燃烧

📅 07-07 👁️ 4447
货到付款最安全? 其实暗藏“维权陷阱”
365不让提款

货到付款最安全? 其实暗藏“维权陷阱”

📅 07-06 👁️ 287
乌拉圭VS沙特阿拉伯
beat365手机下载

乌拉圭VS沙特阿拉伯

📅 07-09 👁️ 6213
电脑无故黑屏重启
365下载手机版

电脑无故黑屏重启

📅 07-09 👁️ 6805
快活林和绿之源哪个活性炭好
365下载手机版

快活林和绿之源哪个活性炭好

📅 07-04 👁️ 8631
勍毅名字寓意,勍毅名字的含义,勍毅取名的寓意和含义是什么