【C++】类的默认成员函数(下)

这篇具有很好参考价值的文章主要介绍了【C++】类的默认成员函数(下)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【C++】类的默认成员函数(下),C++,c++
🔥博客主页 小羊失眠啦.
🎥系列专栏《C语言》 《数据结构》 《C++》 《Linux》 《Cpolar》
❤️感谢大家点赞👍收藏⭐评论✍️


【C++】类的默认成员函数(下),C++,c++

本章主要内容为认识与学习C++非常重要的概念——运算符重载。通过日期类的实现,逐步学习各个运算符重载的实现方法即含义。6个默认成员函数还剩余3个——赋值运算符重载与2个取地址重载,我们本章就会解决它们~

一、运算符重载

1.1 引例

假设现在有一个日期类Date,以及两个Date类对象d1d2。在实际应用中,我们难免会对两个对象进行比较大小加减乘除流插入流提取赋值等一系列操作。在C语言阶段,我们的做法一般是实现各操作对应的函数。例如:

class Date
{
	//...
}
int Add(Date d1,Date d2); //相加
int Sub(Date d1,Date d2); //相减
int Compare(Date d1,Date d2); //比较
//...

虽然这种做法可以满足需求,但是有一个缺点:代码的可读性较差。尽管使用者好像能通过函数名猜出函数的大致功能,但是使用者并不知道函数的具体实现难免会造成错误的使用。

有没有什么方法可以像这样让人一眼就能看懂呢?例如:

d1+d2;
d1-d2;
d1==d2
//...

为了增强代码的可读性,C++中引入了运算符重载的概念。

1.2 概念及运用:

C++为了增强代码的可读性引入了运算符重载,运算符重载是具有特殊函数名的函数,也具有其返回值类型函数名字以及参数列表

运算符重载实际上就如同函数重载,使操作符拥有新的功能。

运算符重载结构:返回值类型 operator操作符(参数列表)

例如

bool operator==(Date d1,Date d2);

1.3 牛刀小试:

定义一个Date类:

namespace Aron
{
	class Date
	{
	public:
		//构造函数
		Date(int year = 0, int month = 0, int day = 0)
		{
			//判断日期是否合法
			//GetMonthDay()获取这个月的天数
			if (month > 0 && month < 13 &&
				(day > 0 && day <= GetMonthDay(year, month)))
			{
				_year = year;
				_month = month;
				_day = day;
			}
			else
				cout << "日期非法" << endl;
		}
	private:
		int _year;//年
		int _month;//月
		int _day;//日
	};
}

1.4 ==重载

我们都知道==是用来比较的运算符,Date类对象进行比较该怎么比较呢?我们可以规定,如果两个对象的年、月、日都相当则两个对象相等,返回true

错误示例

bool operator==(Date d1, Date d2)
{
	return (d1._year == d2._year) &&
		(d1._month == d2._month) &&
		(d1._day == d2._day);
}

int main()
{
	Date d1(2023, 4, 1);
	Date d1(2023, 3, 4);
	//注意优先级问题
	cout << (d1 == d2) << endl;
}

【C++】类的默认成员函数(下),C++,c++

此处有一个典型的错误:该函数不是类的成员函数,无法访问类的私有成员!

有3个办法可以解决:

  1. 将类的成员改为公有(虽然可以解决,但会破坏类的封装性);
  2. 使该函数成为类的友元函数(后面的章节再做讲解);
  3. 将该函数包含在类中成为类的成员函数

目前我们只能选择第3种方法

namespace Aron
{
	class Date
	{
	public:
		//构造函数
		Date(int year = 0, int month = 0, int day = 0)
		{
			//判断日期是否合法
			//GetMonthDay()获取这个月的天数
			if (month > 0 && month < 13 &&
				(day > 0 && day <= GetMonthDay(year, month)))
			{
				_year = year;
				_month = month;
				_day = day;
			}
			else
				cout << "日期非法" << endl;
		}

		bool operator==(Date d1, Date d2)
		{
			return (d1._year == d2._year) &&
				(d1._month == d2._month) &&
				(d1._day == d2._day);
		}

	private:
		int _year;
		int _month;
		int _day;
	};
}

特别注意

  • 二元运算符的重载函数的参数有两个,规定第一个参数左操作数第二个参数右操作数

还记得成员函数有什么特性吗?成员函数有一个自带的参数this,类型为类类型。因为我们不可能将this指针删掉,所以只能省略第一个参数

上一章中曾提到,为减少拷贝引起的消耗,尽量使用引用的方式传参

正确的做法

namespace Aron
{
	class Date
	{
	public:
		//...
		bool operator==(const Date& d)
		{
			return (_year == d._year) &&
				(_month == d._month) &&
				(_day == d._day);
		}
        //...
	};
}

1.5 运算符重载的特性

运算符重载有如下特性

  • 重载操作符必须有一个类类型参数
  • 不能通过连接其他符号来创建新的操作符:比如operator@operator?等;
  • 用于内置类型的运算符,其含义不能改变,例如:int类型的+,不能改变其含义;
  • 作为类成员函数重载时,其形参看起来比操作数数目少1,因为成员函数的第一个参数为隐藏的this
  • .* :: sizeof ?: .注意以上5个运算符不能重载。这个经常在笔试选择题中出现。

1.6 其他运算重载符的实现

有了上述的==作为示例,我们还可以实现< > <= >= + - ++ --等一系列操作符的重载。

1.6.1 > < >= <= != 重载

实现两个重载后,其他重载的实现可以复用已经实现的操作符。

namespace Aron
{
	class Date
	{
	public:
		//...
		bool operator==(const Date& d)
		{
			return (_year == d._year) &&
				(_month == d._month) &&
				(_day == d._day);
		}

		bool operator<(const Date& d)
		{
			return _year < d._year
				|| (_year == d._year && _month < d._month)
				|| (_year == d._year && _month == d._month && _day < d._day);
		}

		bool operator<=(const Date& d)
		{
			//函数的复用
			return *this < d || *this == d;
		}

		bool operator>(const Date& d)
		{
			return !(*this <= d);
		}

		bool operator>=(const Date& d)
		{
			return !(*this < d);
		}

		bool operator!=(const Date& d)
		{
			return !(*this == d);
		}
        //...
	};
}

1.6.2 += -= + - 重载

注意:下列四个运算符的右操作数都为天数

namespace Aron
{
	class Date
	{
	public:
		//...
		int GetMonthDay(int year,int month)
		{
			assert(month > 0 && month < 13);

			int monthArray[13] = { 0,31,28, 31, 30, 31, 30, 31, 31, 30,31,30,31 };
			//判断是否是闰年的二月
			if (month == 2 && ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)))
			{
				return 29;
			}
			else
			{
				return monthArray[month];
			}
		}

		//+=返回自身的引用,减少拷贝
		Date& operator+=(int day)
		{
			//判断是否加了负数
			if (day < 0)
			{
				//复用
				*this -= -day;
				return *this;
			}
			_day += day;
			while (_day > GetMonthDay(_year, _month))
			{
				_day -= GetMonthDay(_year, _month);
				//进位
				_month++;
				if (_month == 13)
				{
					_year++;
					_month = 1;
				}
			}
			return *this;
		}

		//-=返回自身的引用,减少拷贝
		Date& operator-=(int day)
		{
			//判断是否加了一个负数
			if (day < 0)
			{
				//复用
				*this += -day;
				return *this;
			}

			_day -= day;
			while (_day <= 0)
			{
				--_month;
				if (_month == 0)
				{
					--_year;
					_month = 12;
				}

				_day += GetMonthDay(_year, _month);
			}
			return *this;
		}

		Date operator+(int day)
		{
			//拷贝构造
			//因为加不改变自身的值,所以创建临时对象
			Date tmp(*this);

			//复用
			tmp += day;
			return tmp;
		}

		Date operator-(int day)
		{
			Date tmp(*this);
			tmp -= day;
			return tmp;
		}
     //...
	};
}

1.6.3 前置++与后置++重载

前置++和后置++都是一元运算符,为了让前置++与后置++能形成正确重载,C++规定:

  • 后置++重载时多增加一个int类型的参数,但调用函数时该参数不用传递,编译器
    自动传递
namespace Aron
{
	class Date
	{
	public:
		//...
		
		//前置++
		Date& operator++()
		{
			*this += 1;
			return *this;
		}
		
		//后置++
		//注意:后置++是先使用后+1,因此需要返回+1之前的旧值
		//故需在实现时需要先将this保存一份,然后给this+1
		//而tmp是临时对象,因此只能以值的方式返回,不能返回引用
		Date operator++(int)
		{
			Date tmp(*this);
			*this += 1;
			return tmp;
		}

		//前置--
		Date& operator--()
		{
			*this -= 1;
			return *this;
		}
		//后置--
		Date operator--(int)
		{
			Date tmp(*this);
			*this -= 1;
			return tmp;
		}
		//...
	};

}

1.6.4 日期-日期的实现

日期+日期没有意义,但是日期-日期有意义,日期-日期代表相距多少天

namespace Aron
{
	class Date
	{
	public:
		//...

		int operator-(const Date& d)
		{
			Date max = *this;
			Date min = d;
			int flag = 1;

			if (*this < d)
			{
				max = d;
				min = *this;
				flag = -1;
			}

			int n = 0;
			while (min != max)
			{
				++min;
				++n;
			}

			return n * flag;
		}
		//...
	};
}

1.6.5 << 与 >> 重载

错误示例

namespace Aron
{
	class Date
	{
	public:
		//...
		ostream& operator<<(ostream& out)
		{
			out << _year << "年" << _month << "月" << _day << "日" << endl;
			return out;
		}

		istream& operator>>(istream& in)
		{
			in >> _year >> _month >> _day;
			return in;
		}
		//...
	};

}

>> << 是二元操作符,上文中提到二元操作符第一个参数为左操作数,第二个参数为右操作数。此时这段代码第一个参数为this,也就意味着左操作数变成了对象,右操作数变成了cout。那么我们使用时只能这样写:

void Test2()
{
	Date d1(2023, 4, 1);
	d1 << cout;
}

【C++】类的默认成员函数(下),C++,c++

虽然能满足需求,但是用起来感觉怪怪的。由于我们无法改变this的位置,所以只能使用其它办法来实现<< >>的重载了。

这里我们只能将重载定义在类的外面才能避开this的影响。但是类外的函数又访问不了类的私有成员。我们只能通过将重载函数设置为类友元函数来实现了。

namespace Aron
{
	class Date
	{
	public:
        //...
		friend ostream& operator<<(ostream& out, const Date& d);
		friend istream& operator>>(istream& in, Date& d);
        //...

	};

	ostream& operator<<(ostream& out,const Date& d)
	{
		out << d._year << "年" << d._month << "月" << d._day << "日" << endl;
		return out;
	}

	istream& operator>>(istream& in,Date& d)
	{
		in >> d._year >> d._month >> d._day;
		return in;
	}

}

二、简单的测试

到这里,我们试着写一个测试函数验证运算符重载是否正确并学会运算符重载的使用。

void Test3()
{
	Date d1(2023, 4, 1);
	Date d2(2022, 3, 5);
	
	cout << d1 + 1 << endl;
	cout << d2 << endl;
	cout << d1++ << endl;
	cout << d2-- << endl;
	cout << d1 << endl;
	cout << d2 << endl;
	cout << (d1 == d2) << endl;
	cout << (d1 <= d2) << endl;
	cout << (d1 >= d2) << endl;
	cout << (d1 != d2) << endl;
	cout << (d1 + 100) << endl;
	cout << (d2 - 200) << endl;	
}

测试结果:

【C++】类的默认成员函数(下),C++,c++

结果证明我们目前实现的运算符重载以及操作符重载还是挺成功的。小伙伴们在自己实现的时候也要记得边写边测试哦~

三、默认成员函数——赋值运算符重载

与之前讲的构造函数析构函数等默认成员函数相同,赋值运算符重载也属于6个默认成员函数之一。

作为与众不同的默认成员函数,其有以下特性

  1. 赋值运算符重载格式:
    参数类型:const T&,传递引用可以提高传参效率;
    返回值类型:T&,返回引用可以提高返回的效率,有返回值目的是为了支持连续赋值检测是否自己给自己赋值;
    返回*this :要复合连续赋值的含义;

    赋值重载:

    namespace Aron
    {
    	class Date
    	{
    	public:
            //...
    		Date& operator=(const Date& d)
    		{
    			if (*this != d)
    			{
    				_year = d._year;
    				_month = d._month;
    				_day = d._day;
    			}
    			return *this;
    		}
            //...
    
    	};
    
    }
    
    
  2. 赋值运算符只能重载成类的成员函数不能重载成全局函数

    namespace Aron
    {
        class Date
    	{
    		//...
    	};
    }
    // 赋值运算符重载成全局函数,注意重载成全局函数时没有this指针了,需要给两个参数
    Date& operator=(Date& left, const Date& right)
    {
    	if (&left != &right)
    	{
    		left._year = right._year;
    		left._month = right._month;
    		left._day = right._day;
    	}
    	return left;
    }
    

此种情况会出现编译错误error C2801: “operator =”必须是非静态成员

  • 出错原因是:赋值运算符如果不显式实现,编译器会生成一个默认的。此时用户再在类外自己实现一个全局的赋值运算符重载,就和编译器在类中生成的默认赋值运算符重载冲突了,故赋值运算符重载只能是类的成员函数
  1. 用户没有显式实现时,编译器会生成一个默认赋值运算符重载,以值的方式逐字节拷贝。注意:内置类型成员变量是直接赋值的,而自定义类型成员变量需要调用对应类赋值运算符重载完成赋值。
    这里赋值重载与拷贝构造函数的特性非常相似。

这里赋值重载与拷贝构造函数的特性非常相似。


四、默认成员函数——取地址操作符重载

6个默认成员函数只剩两个——取地址重载与const取地址重载。但是,这两个函数实在没有实现的必要,因为我们自己实现与编译器自动实现出来的效果是一样的。

取地址重载

namespace Aron
{
    class Date
    {
        //...
        Date* operator&()
        {
            return this;
        }
        const Date* operator&()const
        {
            return this;
        }
        //...
    };
 }


五、const成员

const修饰的成员函数称之为const成员函数const修饰类成员函数,实际修饰该成员函数隐含的this指针,表明在该成员函数中不能对类的任何成员进行修改

什么情况下需要用const修饰?

我们可能暂时感受不到const修饰的作用,但是遇到如下情况,const修饰就非常有必要了。

namespace Aron
{
     class Date
    {
    public:
        //...
        void print()
        {
            cout << _year << "年" << _month << "月" << _day << "日" << endl;
        }
    private:
        int _year;
        int _month;
        int _day;
    };
}

void Test4()
{
	Date d1(2023, 4, 1);
	d1.print();

	const Date d2(2022, 3, 5);
	d2.print();
}

【C++】类的默认成员函数(下),C++,c++

报错内容为:“void Aron::Date::print(void)”: 不能将“this”指针从“const Aron::Date”转换为“Aron::Date &”

这里是典型的权限放大错误,我们不能将const Date* &d2传递给形参Date* this

改正的办法为同样用const修饰this,但具体的写法可不像我们想的那样。

void print() const
{
	cout << _year << "年" << _month << "月" << _day << "日" << endl;
}

因为我们无法显式的修改this,所以C++规定在函数的后面加上const即为修饰this


六、日期类的实现

我们总结上文中的运算符重载,整理一下完整的日期类的实现。此处我们使用多文件的形式实现—>

  • Date.h文件中进行头文件包含命名空间展开类的声明内联函数定义等;
  • Date.cpp文件中进行对类成员函数的定义。

6.1 Date.h

#pragma once

#include<iostream>
#include<assert.h>
using namespace std;

namespace Aron
{
	//类里面短小函数,适合做内联函数,直接在类里面定义
	class Date
	{
		
	public:

		//构造函数
		Date(int year = 0, int month = 0, int day = 0);
		void print() const;

		bool operator==(const Date& d) const;
		bool operator!=(const Date& d) const;
		bool operator<(const Date& d) const;
		bool operator<=(const Date& d) const;
		bool operator>(const Date& d) const;
		bool operator>=(const Date& d) const;

		int GetMonthDay(int year, int month);


		Date& operator+=(int day);
		Date& operator-=(int day);
		Date operator+(int day) const;
		Date operator-(int day) const;

		Date& operator++();
		Date operator++(int);

		int operator-(const Date& d) const;

		Date& operator--();
		Date operator--(int);


		Date& operator=(const Date& d);

		Date* operator&()
		{
			cout << "Date* operator&()" << endl;

			return (Date*)0x12233222;
		}

		Date* operator&() const
		{
			cout << "const Date* operator&() const" << endl;

			return nullptr;
		}
		//友元函数声明
		friend ostream& operator<<(ostream& out, const Date& d);
		friend istream& operator>>(istream& in, Date& d);

	private:
		int _year;
		int _month;
		int _day;
	};
}

6.2 Date.cpp

#include"Date.h"

namespace Aron
{
	Date::Date(int year, int month, int day)
	{	//判断日期是否合法
		//GetMonthDay()获取这个月的天数
		if (month > 0 && month < 13 &&
			(day > 0 && day <= GetMonthDay(year, month)))
		{
			_year = year;
			_month = month;
			_day = day;
		}
		else
			cout << "日期非法" << endl;
	}

	bool Date::operator==(const Date& d) const
	{
		return (_year == d._year) &&
			(_month == d._month) &&
			(_day == d._day);
	}

	bool Date::operator<(const Date& d) const
	{
		return _year < d._year
			|| (_year == d._year && _month < d._month)
			|| (_year == d._year && _month == d._month && _day < d._day);
	}

	bool Date::operator<=(const Date& d) const
	{
		//函数的复用
		return *this < d || *this == d;
	}

	bool Date::operator>(const Date& d) const
	{
		return !(*this <= d);
	}

	bool Date::operator>=(const Date& d) const
	{
		return !(*this < d);
	}

	bool Date::operator!=(const Date& d) const
	{
		return !(*this == d);
	}

	int Date::GetMonthDay(int year, int month)
	{
		assert(month > 0 && month < 13);

		int monthArray[13] = { 0,31,28, 31, 30, 31, 30, 31, 31, 30,31,30,31 };
		//判断是否是闰年的二月
		if (month == 2 && ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)))
		{
			return 29;
		}
		else
		{
			return monthArray[month];
		}
	}

	//+=返回自身的引用,减少拷贝
	Date& Date::operator+=(int day)
	{
		//判断是否加了负数
		if (day < 0)
		{
			//复用
			*this -= -day;
			return *this;
		}
		_day += day;
		while (_day > GetMonthDay(_year, _month))
		{
			_day -= GetMonthDay(_year, _month);
			//进位
			_month++;
			if (_month == 13)
			{
				_year++;
				_month = 1;
			}
		}
		return *this;
	}

	//-=返回自身的引用,减少拷贝
	Date& Date::operator-=(int day)
	{
		//判断是否加了一个负数
		if (day < 0)
		{
			//复用
			*this += -day;
			return *this;
		}

		_day -= day;
		while (_day <= 0)
		{
			--_month;
			if (_month == 0)
			{
				--_year;
				_month = 12;
			}

			_day += GetMonthDay(_year, _month);
		}
		return *this;
	}

	Date Date::operator+(int day) const
	{
		Date tmp(*this);
		tmp += day;

		return tmp;
	}

	Date Date::operator-(int day) const
	{
		Date tmp(*this);
		tmp -= day;

		return tmp;
	}

	Date& Date::operator++()
	{
		*this += 1;

		return *this;
	}

	Date& Date::operator--()
	{
		*this -= 1;
		return *this;
	}
	//前置++
	Date Date::operator++(int)
	{
		Date tmp(*this);
		*this += 1;

		return tmp;;
	}

	//后置++
	//注意:后置++是先使用后+1,因此需要返回+1之前的旧值
	//故需在实现时需要先将this保存一份,然后给this+1
	//而tmp是临时对象,因此只能以值的方式返回,不能返回引用
	Date Date::operator--(int)
	{
		Date tmp(*this);
		*this -= 1;
		return tmp;
	}


	int Date::operator-(const Date& d) const
	{
		Date max = *this;
		Date min = d;
		int flag = 1;

		if (*this < d)
		{
			max = d;
			min = *this;
			flag = -1;
		}

		int n = 0;
		while (min != max)
		{
			++min;
			++n;
		}

		return n * flag;
	}

	Date& Date::operator=(const Date& d)
	{
		if (*this != d)
		{
			_year = d._year;
			_month = d._month;
			_day = d._day;
		}
		return *this;
	}

	void Date::print() const
	{
		cout << _year << "年" << _month << "月" << _day << "日" << endl;
	}



	ostream& operator<<(ostream& out, const Date& d)
	{
		out << d._year << "年" << d._month << "月" << d._day << "日";
		return out;
	}

	istream& operator>>(istream& in, Date& d)
	{
		in >> d._year >> d._month >> d._day;
		return in;
	}
}

【C++】类的默认成员函数(下),C++,c++文章来源地址https://www.toymoban.com/news/detail-841213.html

到了这里,关于【C++】类的默认成员函数(下)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【C++】类和对象②(类的默认成员函数:构造函数 | 析构函数)

    🔥 个人主页: Forcible Bug Maker 🔥 专栏: C++ 目录 前言 类的6个默认成员函数 构造函数 概念 构造函数的特性及用法 析构函数 概念 析构函数的特性及用法 结语 本篇主要内容:类的6个默认成员函数中的 构造函数 和 析构函数 进入到类和对象内容的第二节,上篇博客中介绍了

    2024年04月16日
    浏览(41)
  • C++从入门到精通——类的6个默认成员函数之拷贝构造函数

    类的6个默认成员函数:如果一个类中什么成员都没有,简称为空类。 空类中真的什么都没有吗?并不是,任何类在什么都不写时,编译器会自动生成以下6个默认成员函数。 默认成员函数:用户没有显式实现,编译器会生成的成员函数称为默认成员函数。 在现实生活中,可

    2024年04月26日
    浏览(35)
  • 【C++初阶】第三站:类和对象(中) -- 类的6个默认成员函数

    目录 前言 类的6个默认成员函数 构造函数 概念 特性 析构函数  概念 特性 拷贝构造函数 概念 特征 赋值运算符重载 运算符重载 赋值运算符重载 const成员 const修饰类成员函数 取地址及const取地址操作符重载 本章总结:         有时候我们写好了一个栈,头脑中第一件事

    2024年02月20日
    浏览(30)
  • 【C++】类和对象③(类的默认成员函数:拷贝构造函数 | 赋值运算符重载)

    🔥 个人主页: Forcible Bug Maker 🔥 专栏: C++ 目录 前言 拷贝构造函数 概念 拷贝构造函数的特性及用法 赋值运算符重载 运算符重载 赋值运算符重载 结语 本篇主要内容:类的6个默认成员函数中的 拷贝构造函数 和 赋值运算符重载 在上篇文章中我们讲到了类的默认成员函数的

    2024年04月17日
    浏览(36)
  • 【C++】中类的6个默认成员函数 取地址及const成员函数 && 学习运算符重载 && 【实现一个日期类】

    1.1 运算符重载【引入】 C++为了增强代码的可读性引入了 运算符重载 ,运算符重载是具有特殊函数名的函数,也具有其返回值类型,函数名字以及参数列表,其返回值类型与参数列表与普通的函数类似。 函数名字为: operator后面接需要重载的运算符符号。 函数原型:

    2024年02月21日
    浏览(38)
  • 【C++精华铺】5.C++类和对象(中)类的六个默认成员函数

    目录 1. 六个默认成员函数 2. 构造函数 2.1 概念 2.2 默认构造 2.2.1 系统生成的默认构造 2.2.2 自定义默认构造函数  2.3 构造函数的重载 3. 析构函数 3.1 概念  3.2 系统生成的析构函数  3.3 自定义析构函数 4. 拷贝构造 4.1 概念  4.2 默认生成的拷贝构造(浅拷贝)  4.3 自定义拷贝构

    2024年02月13日
    浏览(61)
  • C++从入门到精通——类的6个默认成员函数之赋值运算符重载

    类的6个默认成员函数:如果一个类中什么成员都没有,简称为空类。 空类中真的什么都没有吗?并不是,任何类在什么都不写时,编译器会自动生成以下6个默认成员函数。 默认成员函数:用户没有显式实现,编译器会生成的成员函数称为默认成员函数。 C++为了增强代码的

    2024年04月25日
    浏览(44)
  • 【C++练级之路】【Lv.3】类和对象(中)(没掌握类的6个默认成员函数,那你根本就没学过C++!)

    欢迎各位小伙伴关注我的专栏,和我一起系统学习C++,共同探讨和进步哦! 学习专栏 : 《进击的C++》 在C++的学习中,类和对象章节的学习尤为重要,犹如坚固的地基,基础不牢,地动山摇;而默认成员函数的学习,在类和对象的学习里最为重要。所以要 学好C++,学好默认

    2024年02月04日
    浏览(35)
  • 【C++】类和对象④(类的默认成员函数:取地址及const取地址重载 | 再谈构造函数:初始化列表,隐式类型转换,缺省值)

    🔥 个人主页: Forcible Bug Maker 🔥 专栏: C++ 目录 前言 取地址及const取地址操作符重载 再谈构造函数 初始化列表 隐式类型转换 explicit 成员变量缺省值 结语 本篇主要内容:类的六个默认成员函数中的 取地址 及 const取地址重载 , 构造函数 初始化列表 , 隐式类型转换

    2024年04月26日
    浏览(36)
  • 类的默认成员函数——析构函数

    析构函数的功能和构造函数的功能是相反的,构造函数的功能是完成初始化,析构函数的功能是完成对象中资源清理的工作 注意析构函数不是完成对对象本身的销毁,局部对象销毁工作是由编译器完成的,而对象在销毁时会自动调用析构函数,完成对象中资源的清理工作 清

    2024年02月14日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包