C/C++学习笔记八

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类型参数,表示后置运算,不带参数表示前置运算。

猜你喜欢

转载自blog.csdn.net/bashendixie5/article/details/124430145
今日推荐