C++中为什么要用运算符重载,前面一个类名的话是返回类型?那么返回的是类?重载的意义何在呢?const类型初始
例1:classa{public:a():c(5){];aoprater+()(aa1)const{returna(b+a1.b);};private:intb;cons...
例1:
class a
{
public:
a():c(5){];
a oprater +()(a a1)const{return a(b+a1.b);};
private:
int b;
const int c;
形如此例,重载+号不还是用的默认意义吗?既然是默认意义,重载还有什么意义呢?如果说重载是为了不同的类型,那么C++可以处理的默认类型是什么?(运算符可操作的对象是那些?)另,a1是a的一个对象的话,那他怎么可以直接访问私有成员b呢?应该是通过成员函数访问啊;const 类型一般是说声明时就要初始化.既然这样,为什么这里却不初始化呢?如果是说不能在类体内初始化,那么为什么构造函数就可以(不要笑,这不是自相矛盾?)
再例:
#include<iostream>
#include<iomanip>
#include<cmath>
using namespace std;
class Root{ // 一元二次方程的根
public:
const double x1; // 第一个根
const double x2; // 第二个根
const int num_of_roots; // 不同根的数量:0、1 或 2
Root(): x1(0.0), x2(0.0), num_of_roots(0){} //创建一个“无实根”的Root对象
Root(double root):x1(root),x2(root),num_of_roots(1){} //创建一个“有两个相同的实根”的Root对象
Root(double root1, double root2):x1(root1),x2(root2),num_of_roots(2){] //创建一个“有两个不同的实根”的Root对象
.......
}
这个问题就更奇怪了,既然num_of_roots声明为const;那么怎么可以更换其值呢?
忘高手做出详细的解释.
请给出详细代码,谢谢. 展开
class a
{
public:
a():c(5){];
a oprater +()(a a1)const{return a(b+a1.b);};
private:
int b;
const int c;
形如此例,重载+号不还是用的默认意义吗?既然是默认意义,重载还有什么意义呢?如果说重载是为了不同的类型,那么C++可以处理的默认类型是什么?(运算符可操作的对象是那些?)另,a1是a的一个对象的话,那他怎么可以直接访问私有成员b呢?应该是通过成员函数访问啊;const 类型一般是说声明时就要初始化.既然这样,为什么这里却不初始化呢?如果是说不能在类体内初始化,那么为什么构造函数就可以(不要笑,这不是自相矛盾?)
再例:
#include<iostream>
#include<iomanip>
#include<cmath>
using namespace std;
class Root{ // 一元二次方程的根
public:
const double x1; // 第一个根
const double x2; // 第二个根
const int num_of_roots; // 不同根的数量:0、1 或 2
Root(): x1(0.0), x2(0.0), num_of_roots(0){} //创建一个“无实根”的Root对象
Root(double root):x1(root),x2(root),num_of_roots(1){} //创建一个“有两个相同的实根”的Root对象
Root(double root1, double root2):x1(root1),x2(root2),num_of_roots(2){] //创建一个“有两个不同的实根”的Root对象
.......
}
这个问题就更奇怪了,既然num_of_roots声明为const;那么怎么可以更换其值呢?
忘高手做出详细的解释.
请给出详细代码,谢谢. 展开
展开全部
运算符重载是方便你进行类对象与类对象之间的换算
注意是类对象,而不是变量
变量之间的数学运算是默认的,但你自己写的类之间进行运算,如果不用运算符重载是编译不通过的
比如你的例1
如果不写运算符重载函数是无法执行a1+a2的,因为它们是类对象,编译器不知道如何去执行+运算
另外,a1就是a类的,显然是可以访问自己类的私有成员的
最后,const成员不是不可以在类中初始化,只是不能写成const int c=5;这种形式,要么在类外初始化,要么在构造函数中初始化,都是可以的
例2中并不是更换其值,而是给了你两个构造函数。在用第一个构造函数时对象的num_of_roots默认值是1,用第二个构造函数时对象的num_of_roots默认值是2
注意是类对象,而不是变量
变量之间的数学运算是默认的,但你自己写的类之间进行运算,如果不用运算符重载是编译不通过的
比如你的例1
如果不写运算符重载函数是无法执行a1+a2的,因为它们是类对象,编译器不知道如何去执行+运算
另外,a1就是a类的,显然是可以访问自己类的私有成员的
最后,const成员不是不可以在类中初始化,只是不能写成const int c=5;这种形式,要么在类外初始化,要么在构造函数中初始化,都是可以的
例2中并不是更换其值,而是给了你两个构造函数。在用第一个构造函数时对象的num_of_roots默认值是1,用第二个构造函数时对象的num_of_roots默认值是2
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询