【C++系列P3】‘类与对象‘-三部曲——[基础知识](1/3)
前言
- 大家好吖,欢迎来到 YY 滴 C++系列 ,热烈欢迎!
- 【 '类与对象'-三部曲】的大纲主要内容如下:
- 如标题所示,本章是【 '类与对象'-三部曲】三章中的第一章节——基础知识章节,主要内容如下:
目录
一. This指针
1.编译器对This指针的处理本质——不允许修改this,但是允许修改this指向的值
2.This不能在形参和实参显示传递,但是可以在函数内部显示使用
3.例题对比:传入空指针时,this的运作状况
二.explicit关键字
一.基本性质
二.相关知识补充:隐式类型转换
1.为什么加上"引用"无法发生隐式类型转换
三.auto关键字
四.友元
1.友元函数
2.友元类
一. This指针
- This指针本质是形参,所以this指针是和普通参数一样存在函数调用的栈帧里
1.编译器对This指针的处理本质——不允许修改this,但是允许修改this指向的值
void Print(Date* const this) {cout << this->_year << "-" << this->_month << "-" << this->_day << endl; }
2.This不能在形参和实参显示传递,但是可以在函数内部显示使用
void Print() {// this不能在形参和实参显示传递,但是可以在函数内部显示使用//this = nullptr;cout << this << endl;cout << this->_year << "-" << _month << "-" << _day << endl; }
3.例题对比:传入空指针时,this的运作状况
重点注意:p->Print ( ) 并非解引用操作!!!
注意点:Print的地址不在对象中
二.explicit关键字
一.基本性质
用explicit修饰构造函数,将会禁止构造函数的隐式转换
代码演示:
class Date { public:// 1. 单参构造函数,没有使用explicit修饰,具有类型转换作用// explicit修饰构造函数,禁止类型转换---explicit去掉之后,代码可以通过编译explicit Date(int year):_year(year){}/*// 2. 虽然有多个参数,但是创建对象时后两个参数可以不传递,没有使用explicit修饰,具有类型转 换作用// explicit修饰构造函数,禁止类型转换explicit Date(int year, int month = 1, int day = 1): _year(year), _month(month), _day(day){}*/Date& operator=(const Date& d) 拷贝构造{if (this != &d){_year = d._year;_month = d._month;_day = d._day;}return *this;} private:int _year;int _month;int _day; };void Test() {Date d1(2022);// 用一个整形变量给日期类型对象赋值// 实际编译器背后会用2023构造一个无名对象,最后用无名对象给d1对象进行赋值d1 = 2023; }
二.相关知识补充:隐式类型转换
类型转换会产生临时变量/对象
PS:构造函数不仅可以构造与初始化对象,对于单个参数或者除第一个参数无默认值其余均有默认值的构造函数,还具有类型转换的作用
图示:
1.为什么加上"引用"无法发生隐式类型转换
PS:涉及到权限知识点————可通过传送门【】查看const知识点❀❀❀❀
图示:
三.auto关键字
【待补】
四.友元
1.友元函数
友元函数可以直接访问类的私有成员,它是定义在类外部的普通函数,不属于任何类,但需要在类的内部声明,声明时需要加friend关键字
说明:
- 友元函数可访问类的私有和保护成员,但不是类的成员函数
- 友元函数不能用const修饰
- 友元函数可以在类定义的任何地方声明,不受类访问限定符限制
- 一个函数可以是多个类的友元函数
- 友元函数的调用与普通函数的调用原理相同
- 友元函数的声明与函数声明不同,仅仅是表达权限
代码演示:
class Date { //友元函数声明——表达一种权限(函数可以访问类内对象)friend ostream& operator<<(ostream& _cout, const Date& d);friend istream& operator>>(istream& _cin, Date& d);public:Date(int year = 1900, int month = 1, int day = 1): _year(year), _month(month), _day(day){} private:int _year;int _month; int _day; };ostream& operator<<(ostream& _cout, const Date& d) {_cout << d._year << "-" << d._month << "-" << d._day;return _cout; }istream& operator>>(istream& _cin, Date& d) {_cin >> d._year;_cin >> d._month;_cin >> d._day;return _cin; }int main() {Date d;cin >> d;cout << d << endl;return 0; }
2.友元类
说明:
- 友元类的所有成员函数都可以是另一个类的友元函数,都可以访问另一个类中的非公有成员。
- 友元关系是单向的,不具有交换性。
例:比如下面Time类和Date类,在Time类中声明Date类为其友元类,那么可以在Date类中直接访问Time 类的私有成员变量,但想在Time类中访问Date类中私有的成员变量则不行。
- 友元关系不能传递 (如果B是A的友元,C是B的友元,则不能说明C时A的友元)
- 友元关系不能继承(在继承板块有详细介绍)
代码演示:
class Time {friend class Date; // 声明日期类为时间类的友元类 //则在日期类中就直接访问Time类中的私有成员变量 public:Time(int hour = 0, int minute = 0, int second = 0): _hour(hour), _minute(minute), _second(second){} private:int _hour;int _minute;int _second; }; class Date { public:Date(int year = 1900, int month = 1, int day = 1): _year(year), _month(month), _day(day){}void SetTimeOfDate(int hour, int minute, int second){// 直接访问时间类私有的成员变量_t._hour = hour;_t._minute = minute;_t._second = second;} private:int _year;int _month;int _day;Time _t; };