IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C++:类和对象 -> 正文阅读

[C++知识库]C++:类和对象

const关键字

C语言—>const只能修饰变量
C++—>const修改全局或者局部变量、修饰成员函数、修饰成员变量
若一定修改某个成员变量时在定义该成员变量的时候,使用mutable关键字修改该成员

class Date
{
public:
	//Date* const-->this的指向不能修改,但空间内容可修改
	//const Date* const-->this的指向和内容都不能修改
	void Print()const//const成员函数:const修饰成员函数,实际是修饰this指针 不能修改成员变量 
	{
	    _day++;
		cout << _year << "/" << _month << "/" << _day << endl;
	}
private:
	int _year;
	int _month;
	mutable int _day;
};

静态成员函数:

0.通过对象.静态成员函数(…)||类名::静态成员函数(…)
1.必须被static修饰
2.没有this指针,不能直接访问非静态成员变量
3.不可被const修饰

普通成员函数:

0.必须通过对象.静态成员函数(…)
1.不需要static修饰
2.具有隐藏的this指针,可访问普通成员函数
3.可被const修饰

class Date
{
public:
//静态成员函数
	static int Getcount()
	{
		return _count;
	}
private:
	int _year;
	int _month;
	//不在对象中存储,是对每一个对象的共享
	static int _count;//静态成员变量(在类中只声明,必须在类外定义)
};

//必须在成员函数前加类名,且不用static关键字
int Date::_count = 0;
int main()
{
	TestDate();
	cout << Date::Getcount() << endl;
}

构造函数:

成员变量顺序和初始化列表顺序须保持一致

初始化列表可以不写,不写不代表编译器不执行初始化列表
如果用户满没有显示写出初始化列表,编译器会自动补全
对于类中内置类型成员变量,使用随机值填充
对于类中自定义类型的成员变量,调用对应类的无参或者全缺省参数初始化构造

	//explicit关键字构造方法,表明禁止单参构造方法类型转化void TestDate4()
	explicit Date(int year = 1999, int month = 1, int day = 1) :_year(year), _month(month), _day(day)
	{}
	//构造函数
	//Date(int year = 1999, int month = 1, int day = 1)
	//{
	//	_year = year;
	//	_month = month;
	//	_day = day;
	//}
void TestDate4()
{
	Date d(2022);

	//先用2023调用单参的构造方法创建一个匿名对象
	//使用匿名对象给d进行赋值
	//匿名对象赋值结束之后被销毁
	//d = 2023;使用explicit关键字后无法调用
}

拷贝构造函数 :

	Date(const Date& d)
	{
		_year = d._year;
		_month = d._month;
		_day = d._day;
	}


//拷贝构造函数场景1
void TestDate1()	
{
	Date d1(1999, 1, 1);

	Date d2(d1);
}
//拷贝构造函数场景2:以值的方式传参
void TestDate2(Date d)
{

	
}
//拷贝构造函数场景3:以值的方式返回
//如果返回的是匿名对象,则不会进行拷贝,而是直接将匿名对象返回
//匿名对象:没有名字的对象  例:Date(1999,1,1)
//场景2同理
Date TestDate3()	
{
	Date d;
	return d;
}

重载:

重载==

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

重载=


	Date& operator=(const Date& d)
	{
		if (this != &d)//检测是否为自己赋值
		{
			_year = d._year;
			_month = d._month;
			_day = d._day;
		}
		//return d;//无法完成a1=a2=a3;的赋值
		return *this;
	}

重载 后置++ 前置++

//为了区分前置++,后置++,规定给后置++添加一个int参数
	//重载 后置++ (a++)
	Date& operator++(int)
	{
		Date temp(*this);
		_day += 1;
		return temp;
	}
	//重载 前置++(++a)
	Date& operator++()
	{
		_day += 1;
		return *this;
	}

重载流运算符:
第一个参数必须是ostream&,因此该运算符不能重载成类的成员函数,只能重载成全局函数,并在类中声明友元函数
类的成员函数**(不使用)**:

//重载<<
	//void operator<<(Date* const this,ostream& out)
	//须d<<cout;调用不符合常规
	//d.operator<<(cout);
	void operator<<(ostream& out)
	{
		out << _year << "/" << _month << "/" << _day << endl;
	}

全局函数,在类中的友元函数:

class Date
{
   public:
      Date(int year = 1999, int month = 1, int day = 1) :_year(year), _month(month), _day(day)
	{

	}
	//友元函数
    friend ostream& operator<<(ostream& out, const Date& d);
    friend istream& operator>>(istream& in, Date& d);
private:
	int _year;
	int _month;
	int _day;
};
//返回值类型ostream&,目的是为了支持连续输出
ostream& operator<<(ostream& out, const Date& d)
{
	out << d._year << "/" << d._month << "/" << d._day ;
}
istream& operator>>(istream& in, Date& d)
{
	in >> d._year >> d._month >> d._day;
}
int main()
{
   Date d1(2222,2,2);
   cout<<d1;
}

析构函数

	~Date()
	{

	}

友元函数:

1.不是成员函数,则没有this指针
2.不能被const修饰,因为没有this指针
3.不受访问限定符约束,因为不是类的成员函数
4.一个类可拥有多个友元函数
5.不具有交换性

class Time
{
public:
	Time(int hour,int minute,int second):_hour(hour),_minute(minute),_second(second)
	{}
	//友元函数
	friend void TestFriend();
private:
	int _hour;
	int _minute;
	int _second;
};
class Date
{
   public:
      Date(int year = 1999, int month = 1, int day = 1) :_year(year), _month(month), _day(day)
	{

	}
	//友元函数
    friend void TestFriend();
private:
	int _year;
	int _month;
	mutable int _day;
};
void TestFriend()
{
   Date d(2002,1,1);
   d._day+=1;
   Time t(16,2,1);
   t._second+=1;
}

内部类:(外部类的友元类)

是一个独立的类,不属于外部类,更不能通过外部类的对象去访问内部类的成员

//内部类
class List
{
	class ListNode
	{
	public:
		ListNode(ListNode* next, int data = 0) :_next(nullptr), _data(data)
		{
		}
	private:
		ListNode* _next;
		int _data;
		
	};
public:
	List(List* head) :_head(nullptr)
	{
	}

public:
	void PushBack(int data)
	{
	}
	void PushFront(int data)
	{
	}
	void PopBack()
	{
	}
	void PopFront()
	{
	}
private:
	List* _head;
};
  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-12-25 10:47:31  更:2022-12-25 10:51:55 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/22 18:53:15-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码