从C++开始的编程生活(7)——取地址运算符重载、类型转换、static成员和友元
前言
本系列文章承接C语言的学习,需要有C语言的基础才能学会哦~
第7篇主要讲的是有关于C++的取地址运算符重载、类型转换、static成员和友元。
C++才起步,都很简单
目录
前言
取地址运算符重载
const成员函数
基本语法
特点
取地址运算符重载
类型转换
static成员
友元
特点
取地址运算符重载
const成员函数
tips:const只有在修饰指向内容的时候,才设计权限的放大和缩小的问题。
基本语法
//无const,传入参数为Date* const this,不可修改this指针本身
void Print()
{cout << _year << "-" << _month << "-" <<_day;
}//有const,传入参数为const Date* const this,不可修改this指针和其指向的内容
void Print() const
{cout << _year << "-" << _month << "-" <<_day;
}
如上,const修饰后的成员函数Print,不可以在对类的任何成员进行修改
特点
①const修饰的成员函数,const放在参数列表后。
②const修饰后,成员函数不可以修改类对象的任何成员。
使用const,可以避免成员被意外修改,应加尽加
取地址运算符重载
对于自定义类型,只要是运算符,要使用必须先重载。
Date* operator&()
{return this;
}const Date* operator&() const
{return this;
}
为了避免权限问题,需要重载取Date*指针和const Date*指针。或者可以自定义返回一个任意地址(也可空指针),不过要当心出错。
类型转换
C++11,支持内置类型隐式类型转化为自定义类型,但是需要有相关内置类型为参数的构造函数。
该隐式转换过程中需要调用到构造函数。
//类A的构造函数
A(int a1)
:_aa1(a1)
{}//运行代码
A aa1 = 1;
①语法上,先用常数1作为构造函数的参数,构造一个临时对象,再用这个临时对象拷贝构造为aa1。这里会出现连续的构造,而编译器会将其优化为直接一次构造。
A& aa2 = 1;//不可行×
如上,要注意以1构造的临时对象为const修饰,要注意权限问题。
const A& aa3 = 1;
②如果不想发生内置类型隐式转换为自定义类型,则用关键字explicit。
③若A类型有多个内置类型成员(构造函数有多个参数),想用两个或以上参数进行隐式转换,需要用大括号和逗号表达。(如下)。
A aa3 = {1, 1}
static成员
①static修饰的成员变量,成为静态成员变量,static变量必须要在类外初始化。(类里面声明,类外初始化)
②static成员变量不属于某个具体对象,存放在静态区。
③static修饰的成员函数,称之为静态成员函数,static函数没有this指针。
④static成员函数可以访问静态成员,但是不能访问非静态的成员,因为他没有this指针,没有隐藏的this指针
⑤不可以在声明时给static成员变量缺省值。
⑥非静态成员函数,可以访问任意的静态成员变量和静态成员函数。
⑦同样受访问限定符限制
友元
提供了一种突破类访问限定符的封装来访问的方式,在声明前加friend修饰,友元分为友元函数、友元类。
特点
①友元函数可以访问类的私有和保护成员,但他只是声明,不是类的成员函数,而是外部函数。
②友元可以在类的任何位置声明,不受访问限定符的限制。
③一个类中,友元类的成员函数也是该类的友元函数。
④一个函数可以是多个类的友元函数。
⑤不具有交换性和传递性。比如,A是B的友元,但是B不是A的友元;A是B的友元,B是C的友元,但是A不是C的友元。
⑥友元会破坏封装,所以不适宜多用。
❤~~本文完结!!感谢观看!!接下来更精彩!!欢迎来我博客做客~~❤