1、构造函数自动转换
从CUser User = 2;这句来看,按理是不能通过编译的,不过在这里实际上调用了CUser(int nData)构造函数。
但是开发的时候,有时还需要禁止构造函数的自动转换功能(通过在构造函数前面加explicit关键字实现),因为有时候会让人误解。
#include "stdafx.h"
#include "iostream.h"
#include "string.h"
class CUser //定义一个类
{
public: //设置成员访问级别
char m_Username[128]; //定义数据成员
char m_Password[128]; //定义数据成员
int m_nLevel; //操作员级别
public:
CUser() //默认构造函数
{
m_nLevel = 1;
strcpy(m_Username, "MR"); //为数据成员赋值
strcpy(m_Password, "KJ"); //为数据成员赋值
cout << "构造函数被调用!" << endl; //输出信息
}
CUser(int nData) //构造函数
{
m_nLevel = nData;
cout << "复制对象!" << endl; //输出信息
}
};
int main(int argc, char* argv[])
{
CUser User = 2; //为User对象赋值
cout << "m_nLevel = " << User.m_nLevel << endl; //输出信息
return 0;
}
2、运算符重载
如果在类CUser中重载+运算符,则可以实现两个同类型对象的加法运算。
#include "stdafx.h"
#include "iostream.h"
#include "string.h"
class CUser //定义一个类
{
public: //设置成员访问级别
char m_Username[128]; //定义数据成员
char m_Password[128]; //定义数据成员
int m_nLevel; //操作员级别
public:
CUser() //默认构造函数
{
m_nLevel = 1;
strcpy(m_Username, "MR"); //为数据成员赋值
strcpy(m_Password, "KJ"); //为数据成员赋值
cout << "构造函数被调用!" << endl; //输出信息
}
CUser operator + (CUser & refUser) //重载+运算符
{
CUser User;
User.m_nLevel = m_nLevel + refUser.m_nLevel;
return User;
}
};
int main(int argc, char* argv[])
{
CUser User, comUser;
CUser defUser = User + comUser; //进行加法运算
cout << "m_nLevel = " << defUser.m_nLevel << endl;
return 0;
}
如果用户想要实现CUser对象与一个整数相加,可以通过修改重载运算符的参数来实现。
CUser operator + (int nData) //重载+运算符
{
CUser User;
User.m_nLevel = m_nLevel + nData;
return User;
}
这样即可实现CUser对象和一个整数的加法。
CUser User;
CUser defUser = User + 10;
前置运算
CUser operator ++ () //重载++运算符
{
++m_nLevel;
}
3、转换运算符
#include "stdafx.h"
#include "iostream.h"
#include "string.h"
class CUser //定义一个类
{
public: //设置成员访问级别
char m_Username[128]; //定义数据成员
char m_Password[128]; //定义数据成员
int m_nLevel; //操作员级别
public:
CUser() //默认构造函数
{
m_nLevel = 1;
strcpy(m_Username, "MR"); //为数据成员赋值
strcpy(m_Password, "KJ"); //为数据成员赋值
cout << "构造函数被调用!" << endl; //输出信息
}
operator int () //转换运算符
{
return m_nLevel;
}
};
int main(int argc, char* argv[])
{
CUser User;
int nData = User; //将CUser对象赋值给一个整型变量
cout << "m_nLevel = " << nData << endl;
return 0;
}
4、总结
用户在程序中重载运算符,需要遵守如下规则:
(1)并不是所有的C++运算符都可以重载。
对于C++中的大多数运算符来说都可以重载。但是“::”、“?”、“:”、“.”运算符不能被重载。
(2)运算符重载的一些限制。
不能构建新的运算符。
不能改变原有运算符操作数的个数。
不能改变原有运算符的优先级。
不能改变原有运算符的结合性。
不能改变原有运算符的语法结构。
(3)运算符重载的基本准则。
一元操作数可以是不带参数的的成员函数,或者是带一个参数的非成员函数。
二元操作数可以是带一个参数的成员函数,或者是带两个参数的非成员函数。
“=”、“[]”、“->”、“()”、运算符只能定义为成员函数。
“->”运算符的返回值只能是指针类型或者能够使用“->”运算符类型对象。
重载“++”和“--”运算符时,带一个int类型参数,表示后置运算,不带参数表示前置运算。